解决Bash脚本向syslog-ng发送dhcp.leases的1024字符截断问题
解决OpenWrt下dhcp.leases逐条发送至syslog-ng避免截断及数据缺失问题
核心解决方案:逐行读取并发送日志
直接逐行读取dhcp.leases文件,每行单独调用logger命令发送,从根源避免单条日志超1024字符截断的问题,同时解决整块发送导致的数据缺失。
以下是可直接使用的Bash脚本:
#!/bin/bash # OpenWrt默认dhcp.leases路径,若有修改请自行调整 LEASES_FILE="/var/lib/misc/dhcp.leases" # 逐行读取文件,保留原始格式并跳过空行 while IFS= read -r line; do # 过滤空行,避免无效日志 [[ -z "$line" ]] && continue # 发送单条日志,添加专属标签方便syslog-ng过滤 logger -t "dhcp_leases_monitor" "$line" done < "$LEASES_FILE"
关键细节说明
IFS= read -r line:保证读取每行时完整保留开头/结尾的空格,同时不把反斜杠识别为转义字符,彻底避免数据丢失。- 跳过空行:过滤文件中可能存在的空白行,减少无效日志输出。
- 日志标签
-t "dhcp_leases_monitor":给每条dhcp日志添加专属标识,后续在syslog-ng中可通过该标签快速筛选、转发日志到Node-RED。
排查数据缺失的补充优化
如果运行脚本后仍有数据缺失,大概率是dhcpd写入文件时和脚本读取产生冲突,可通过文件锁解决:
#!/bin/bash LEASES_FILE="/var/lib/misc/dhcp.leases" LOCK_FILE="$LEASES_FILE.lock" # 加锁后读取文件,避免dhcpd写入时的冲突 ( # 非阻塞加锁,获取不到锁直接退出,避免脚本挂起 flock -n 9 || exit 1 while IFS= read -r line; do [[ -z "$line" ]] && continue logger -t "dhcp_leases_monitor" "$line" done < "$LEASES_FILE" ) 9>"$LOCK_FILE"
对接Node-RED与HomeAssistant注意事项
在syslog-ng配置中,添加规则匹配带有dhcp_leases_monitor标签的日志,将其转发到Node-RED的syslog输入节点;Node-RED解析每行日志的MAC地址、IP、主机名等信息后,再推送到HomeAssistant实现WiFi设备的实时状态监控。
内容的提问来源于stack exchange,提问作者dckiller
相关产品推荐
相关产品推荐

