关键在于用rsyslog模块化能力实现统一接入、动态解析、拓扑路由:启用UDP/TCP双协议与白名单保障稳定接入;通过mmnormalize秒级解析非标日志为结构化字段;结合IP映射表与动态模板按拓扑自动分类存储。

要让全网网络设备(包括非标日志格式的思科、华为、H3C、锐捷等)的日志流秒级进入 rsyslog 并输出为标准 Syslog 格式、按拓扑结构自动归类存储,关键不在“装得多”,而在收得稳、分得清、存得准。核心思路是:用 rsyslog 的模块化能力做三件事——统一接入、动态解析、拓扑路由。
一、确保日志能稳定进来:启用双协议+来源白名单
网络设备日志多走 UDP(轻量、低开销),但丢包风险高;部分关键设备(如防火墙、核心交换机)建议配 TCP(可靠、有序)。两者可共存。
-
编辑
/etc/rsyslog.conf,启用输入模块:$ModLoad imudp $UDPServerRun 514 $ModLoad imtcp $InputTCPServerRun 514
-
限制只接收可信网段(防日志洪水或伪造):
$AllowedSender UDP,192.168.10.0/24 $AllowedSender UDP,10.0.0.0/8 $AllowedSender TCP,192.168.10.0/24
⚠️ 注意:
$AllowedSender必须放在imudp/imtcp加载之后、规则之前,否则不生效。CentOS 7.9 默认不启用该指令,漏配会导致日志被静默丢弃。
二、把“非标日志”变“标准 Syslog”:用 mmnormalize 做秒级字段提取
思科默认发 *May 18 11:23:45.123: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet1/0/1, changed state to up
华为/H3C 多为 May 18 2026 11:23:45 BEIJING %SEC/4/USER_LOGIN: User 'admin' logged in from 192.168.1.100 via SSH.
这些不是标准 syslog 报文(缺 PRI、TIMESTAMP 格式不统一、HOSTNAME 不规范),rsyslog 默认无法正确识别 fromhost-ip 或 syslogtag。
解决办法:加载 mmnormalize 模块,写轻量规则提取关键字段:
-
启用模块(在 MODULES 区):
$ModLoad mmnormalize
-
在
/etc/rsyslog.d/10-network-device-norm.conf中定义解析规则:# 思科类(含%开头、空格分隔、带冒号结尾) if $rawmsg contains '%' and $rawmsg startswith '*' then { action(type="mmnormalize" ruleBase="/etc/rsyslog.d/cisco.rule") } # 华为/H3C类(含年份、时区、%SEC/... 或 %DEV/...) if $rawmsg contains 'SEC/' or $rawmsg contains 'DEV/' or $rawmsg contains 'AAA/' then { action(type="mmnormalize" ruleBase="/etc/rsyslog.d/huawei.rule") } -
示例
/etc/rsyslog.d/cisco.rule:rule=:%timestamp:word% %hostname:word% %%facility:word%-%severity:number%-%msgid:word%: %msg:rest%
✅ 效果:解析后自动补全
$!hostname、$!facility、$!severity等结构化字段,后续所有路由、模板都可基于这些变量操作,不再依赖原始文本匹配。
三、按网络拓扑自动分类存储:用模板 + 动态路径实现“设备即目录”
标准 Syslog 本身不含拓扑信息。你需要把 IP → 设备角色 → 机房/区域 映射进路径。推荐用“IP反查+配置文件映射”方式,兼顾灵活性与性能:
-
创建映射表
/etc/rsyslog.d/topo-map.json(示例):{ "192.168.10.1": {"site":"beijing-core", "role":"core-switch"}, "192.168.10.2": {"site":"beijing-access", "role":"access-switch"}, "10.1.5.100": {"site":"shanghai-fw", "role":"firewall"} } -
定义模板,优先用
$fromhost-ip查表, fallback 到 IP 目录:$template TopoPath,"/var/log/network/%$.site%/%$.role%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log" *.* ?TopoPath & stop
-
配合
omprog或外部脚本(如 Python)做实时查表(需启用omprog模块),或更简单:用property()+lookup表(rsyslog v8.20+ 支持,CentOS 7.9 自带 rsyslog 8.24,可用):$lookup_table name="topo" file="/etc/rsyslog.d/topo-map.json" type="string" $template TopoPath,"/var/log/network/%lookup::topo::%fromhost-ip%::site%/%lookup::topo::%fromhost-ip%::role%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log"
✅ 结果:
192.168.10.1的日志自动落到/var/log/network/beijing-core/core-switch/192.168.10.1_2026-05-18.log,天然形成物理/逻辑拓扑视图。
四、验证与运维要点
-
秒级生效:修改配置后执行
sudo rsyslogd -N1检查语法,再sudo systemctl reload rsyslog(非 restart,避免丢日志)。 -
确认解析效果:临时加一条调试规则,把原始和解析后内容写入测试文件,观察
$!msg、$!hostname是否已结构化。 -
防止单点瓶颈:若设备超 200 台,建议开启队列:
$WorkDirectory /var/lib/rsyslog $ActionQueueFileName fwdq $ActionQueueMaxDiskSpace 2g $ActionQueueSaveOnShutdown on
-
日志轮转:配合
logrotate按天切割,避免单文件过大(尤其 TCP 场景下易堆积)。
不需要改设备配置,也不依赖外部中间件。整套方案全部基于 rsyslog 原生命令与模块,部署快、无额外组件、资源占用低。











