日志标准化与规范化是围绕可解析性、可路由性、可归档性展开的系统工程,核心是使日志从“人能看懂”变为“机器可结构化处理”。1. 标准化:通过模板(如rfc5424或compact)统一输出结构;2. 规范化:用mmnormalize提取网络设备日志字段;3. 拓扑化:结合ip映射与动态路径实现自动分类存储。

日志格式标准化与规范化在 rsyslog 环境中不是“统一写成一行”那么简单,而是围绕可解析性、可路由性、可归档性三个目标展开的系统工程。核心在于让原始日志从“人能看懂”变成“机器能结构化处理”,从而支撑后续的检索、告警和拓扑分析。
标准化:用模板统一输出结构
默认日志格式(如 Jul 7 11:05:22 web01 sshd[1234]: Connection closed)缺少时间精度、主机标识模糊、字段边界不清晰,不利于自动化消费。通过定义 string 类型模板可强制统一:
- 启用标准 RFC5424 格式(含 PRI、TIMESTAMP、HOSTNAME、APP-NAME、MSGID):
$template rfc5424,"%TIMESTAMP:::date-rfc3339% %HOSTNAME% %APP-NAME% %PROCID% %MSGID% %STRUCTURED-DATA% %msg%\n" - 适配中文环境或简化场景,用紧凑格式保留关键字段:
$template compact,"%$year%-%$month%-%$day%T%$hour%:%$min%:%$sec%Z %hostname% %programname%[%pid%]: %msg%\n" - 模板需绑定到规则才生效,例如:
*.* /var/log/all.log;compact
规范化:用 mmnormalize 提取结构化字段
网络设备(思科/华为/H3C)日志不是标准 syslog 报文,rsyslog 默认无法识别其来源 IP 或事件类型。必须借助 mmnormalize 模块做字段剥离:
- 加载模块:
$ModLoad mmnormalize - 编写轻量规则文件(如
/etc/rsyslog.d/cisco.rule):rule=:%timestamp:date-rfc3339% %host%%:space%%msg%
匹配May 18 11:23:45.123: %LINEPROTO-5-UPDOWN: ...并提取 timestamp、host、msg - 在规则中调用:
if $rawmsg contains '%' and $rawmsg startswith '*' then { action(type="mmnormalize" ruleBase="/etc/rsyslog.d/cisco.rule") }
拓扑化:按设备归属自动分类存储
标准化之后的日志还需“知道它属于哪台设备、哪个区域”,才能支撑分权查看与故障定位。关键是结合 IP 映射 + 动态路径模板:
- 建立 IP→拓扑标签映射表(如
/etc/rsyslog.d/topo-map.json),内容示例:{"192.168.10.5": "core-sw-dc1", "10.20.30.100": "fw-edge-prod"} - 用
mmjsonparse解析映射结果,再用%!topo%属性参与模板:$template bytopo,"/var/log/topo/%!topo%/syslog-%$year%-%$month%.log" - 最终路由规则:
*.* ?bytopo(注意问号表示使用模板名而非文件路径)
验证与落地要点
规范是否生效不能只看文件有没有生成,而要看字段是否真正可用:
- 用
logger -p local0.info "test"发送测试日志,检查是否进入预期路径 - 对已接收设备日志执行
rsyslogd -N1验证配置语法,再用journalctl -u rsyslog -f观察实时解析行为 - 关键字段(如
%fromhost-ip%、%syslogtag%、%$!{topo}%)必须在模板中显式引用,否则不会被计算 - 所有模块加载语句(
$ModLoad)须置于配置文件 MODULES 区段,且顺序影响功能链路











