You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决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"

关键细节说明

  1. IFS= read -r line:保证读取每行时完整保留开头/结尾的空格,同时不把反斜杠识别为转义字符,彻底避免数据丢失。
  2. 跳过空行:过滤文件中可能存在的空白行,减少无效日志输出。
  3. 日志标签-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:05:00