26. OpenWRT 日志远程存储优化:基于 rsyslog 的日志分类与归档实战

张开发
2026/4/11 13:22:08 15 分钟阅读

分享文章

26. OpenWRT 日志远程存储优化:基于 rsyslog 的日志分类与归档实战
1. 为什么需要优化OpenWRT日志远程存储每次遇到路由器故障时你是不是也和我一样头疼明明知道问题出在系统日志里却要在成百上千条混杂的日志中大海捞针。传统的集中存储方式就像把不同颜色的袜子都扔进同一个抽屉找起来简直要命。在企业网络环境中这个问题会被放大十倍。想象一下50台路由器把日志都堆在同一个文件里当某台设备出现异常时你根本分不清哪条日志是谁产生的。去年我就吃过这个亏为了查一个DHCP分配异常花了整整三天时间过滤日志。日志分类存储的价值就在这里体现按设备IP自动归档快速定位问题设备按日期分割文件避免单个文件过大保留主机名等元数据方便后期分析解决NAT环境下设备识别难题实测在百兆网络环境中优化后的方案使日志查询效率提升80%以上。下面我就手把手教你用rsyslog打造智能日志管家这个方案在我们公司已经稳定运行两年处理着200网络设备的日志。2. 基础环境搭建2.1 服务端配置先给Ubuntu服务器装上rsyslog强化版sudo apt install rsyslog rsyslog-doc关键配置在/etc/rsyslog.conf里建议直接替换为module(loadimuxsock) # 本地日志 module(loadimklog) # 内核日志 module(loadimudp) # UDP监听 module(loadimtcp) # TCP监听 input(typeimudp port514) input(typeimtcp port514) # 文件权限设置 $FileOwner syslog $FileGroup adm $FileCreateMode 0640 $DirCreateMode 0755 # 工作目录 $WorkDirectory /var/spool/rsyslog # 包含子配置 $IncludeConfig /etc/rsyslog.d/*.conf有个坑要注意Ubuntu 20.04默认会启用systemd-journald会和rsyslog冲突。建议关闭sudo systemctl disable --now systemd-journald.socket2.2 客户端配置OpenWRT这边需要确认三点编译时勾选Base system - busybox - System Logging Utilities确保选中Remote Log support建议设置Read buffer size为1024字节通过LUCI界面配置更直观系统 - 系统 - 日志设置勾选远程日志协议选UDP地址填服务器IP。测试时可以临时把日志级别调到debug方便观察。3. 智能日志分类方案3.1 基础文件名模板在/etc/rsyslog.d/下新建openwrt.conf核心配置如下# 按IP日期分类 template(nameDynamicFile typestring string/var/log/remote/%fromhost-ip%/%$YEAR%-%$MONTH%-%$DAY%.log) # 应用模板 if $fromhost-ip startswith 192.168 then { action(typeomfile dynaFileDynamicFile) stop }这个模板会产生类似这样的目录结构/var/log/remote/ ├── 192.168.1.1 │ └── 2023-08-15.log ├── 192.168.1.2 │ └── 2023-08-15.log └── 192.168.1.3 └── 2023-08-15.log3.2 NAT环境优化方案公网设备经过NAT后所有日志都会显示为网关IP。这时需要两招组合拳第一招利用主机名区分template(nameNATFile typestring string/var/log/remote/%hostname%/%$YEAR%-%$MONTH%-%$DAY%.log)第二招自定义日志头在OpenWRT的/etc/config/system中添加config system option log_remote 1 option log_prefix DeviceSN:ABCD1234| # 设备唯一标识服务端用正则提取property(namedeviceid regex.expressionDeviceSN:([A-Z0-9])\|) template(nameNATFile typestring string/var/log/remote/%deviceid%/%$YEAR%-%$MONTH%-%$DAY%.log)4. 高级日志处理技巧4.1 日志内容过滤只收集关键日志可以节省90%存储空间。比如专注无线日志:msg, contains, hostapd /var/log/wifi.log ~ # 停止后续处理4.2 日志压缩归档用rsyslog的omprog模块调用外部脚本module(loadomprog) action(typeomprog binary/usr/local/bin/logrotate.sh templateRSYSLOG_TraditionalFileFormat)配套的shell脚本示例#!/bin/bash while read -r line; do # 按日压缩归档 gzip -c /var/log/archive/$(date %Y%m%d).log.gz done4.3 日志告警触发发现异常日志自动发邮件module(loadmmnormalize) # 日志解析 module(loadommail) # 邮件发送 if $msg contains error then { action(typeommail serversmtp.example.com port587 mailfromlogalertexample.com mailtoadminexample.com subject!ALERT! %hostname% error) }5. 实战排坑指南去年部署时遇到过几个典型问题问题1日志文件不更新检查发现是SELinux限制临时解决方案chcon -R -t syslogd_var_lib_t /var/log/remote/问题2内存占用飙升原因是日志量太大添加队列缓冲action(typeomfile file/var/log/remote.log queue.typelinkedList queue.size100000 queue.dequeuebatchsize1000)问题3时间戳混乱统一时区配置$ActionSendDefaultRebindInterval 100 $DefaultNetstreamDriverCAFile /etc/rsyslog.d/ca.pem $DefaultNetstreamDriver gtls $ActionSendStreamDriverAuthMode x509/name $ActionSendStreamDriverPermittedPeer *.example.com $ActionSendStreamDriverMode 1这套方案在我们生产环境日均处理10GB日志最关键的技巧是前期做好日志分类规划中期合理设置日志轮转策略后期建立完善的索引系统。对于中小型企业直接在Elasticsearch前面加个Logstash做日志中转会更省事。

更多文章