4. 系统日志与内核日志管理
任务说明
在OpenWrt网关开发中,日志是定位网络故障、分析异常重启和调试驱动程序的核心依据。本案例目标是在OpenWrt设备上完成三项工作:配置系统日志(syslog)与内核日志(kmsg)的输出级别;将日志实时发送至远程日志服务器;实现日志的本地持久化存储,确保重启后日志不丢失。
日志架构与配置原理
OpenWrt使用BusyBox自带的syslogd/klogd组件。syslogd负责收集用户态程序日志,klogd负责读取内核环形缓冲区(/proc/kmsg)中的内核日志,并将两者统一写入日志文件或转发至远程服务器。日志级别遵循标准Syslog协议,从高到低依次为:emerg(0)、alert(1)、crit(2)、err(3)、warning(4)、notice(5)、info(6)、debug(7)。设置日志级别为N时,表示只记录级别数值小于等于N的日志。
实现步骤
1. 配置日志级别与远程服务器
OpenWrt的日志配置集中在/etc/config/system文件中。通过UCI命令行修改log节段:log_level控制记录的最低级别(7为debug最详细,4为warning以上),log_remote指定远程服务器地址,log_proto选择UDP或TCP传输。修改后需重启syslogd服务使配置生效。
# 查看当前日志配置
uci show system.@log[0]
# 设置日志级别为 debug(记录所有级别日志)
uci set system.@log[0].log_level='7'
# 启用远程日志服务器(UDP 514端口)
uci set system.@log[0].log_remote='192.168.1.100'
uci set system.@log[0].log_proto='udp'
# 提交并应用配置
uci commit system
/etc/init.d/log restart
2. 配置日志持久化
OpenWrt默认将日志保存在内存文件系统/var/log/messages中,重启即丢失。为实现持久化,需将日志目录重定向至可写的外部存储(如ext4格式的USB盘或已挂载的overlay分区)。以下示例将日志存储至/mnt/sda1/logs目录:
# 创建持久化日志目录
mkdir -p /mnt/sda1/logs
# 修改syslogd启动参数,指定日志文件路径
uci set system.@log[0].log_file='/mnt/sda1/logs/messages'
uci set system.@log[0].log_size='200' # 单个日志文件最大200KB
uci set system.@log[0].log_count='5' # 保留5个轮转文件
# 提交并重启
uci commit system
/etc/init.d/log restart
# 验证日志文件已写入持久化目录
ls -l /mnt/sda1/logs/
3. 内核日志独立查看与级别过滤
内核日志通过klogd读取后同样进入syslogd统一管理。若需单独查看内核日志,可直接读取/proc/kmsg(需root权限),或使用dmesg命令。以下命令演示如何查看内核日志并过滤指定级别:
# 查看最近的内核日志(含时间戳)
dmesg -T | tail -20
# 仅显示err级别及以上的内核日志
dmesg -l err,crit,alert,emerg
# 实时跟踪内核日志输出
dmesg -w
验证方法与判定标准
完成配置后,按以下步骤验证功能是否全部生效:
# 1. 验证日志级别配置已生效
logread | grep "log_level" # 应看到级别为7的配置记录
# 2. 生成本地测试日志
logger -p user.notice "OpenWrt log test message"
# 3. 验证本地持久化文件已记录
tail -5 /mnt/sda1/logs/messages | grep "log test"
# 4. 验证远程服务器已收到日志
# 在远程服务器(192.168.1.100)上执行:
# tcpdump -i eth0 udp port 514 -c 5
# 应能看到来自OpenWrt设备的UDP数据包
# 5. 验证内核日志可正常读取
dmesg | grep "Linux version" # 应输出内核版本信息
判定标准:①logread能显示级别为7的配置;②logger生成的测试消息出现在/mnt/sda1/logs/messages文件中;③远程服务器通过tcpdump能捕获到来自本设备的UDP 514端口数据包;④dmesg命令能正常输出内核日志。四项全部满足即判定案例通过。
注意事项:若设备无外部存储,可将日志文件指向overlay分区(/overlay)下的路径实现持久化,但需确保overlay有足够剩余空间。远程日志服务器需提前开放UDP 514端口入站规则,否则日志转发会静默失败。