用mmnormalize在边缘节点实现秒级日志清洗,将非结构化syslog预处理为结构化字段,降低后端解析压力;其轻量、无依赖、低资源占用,适配边缘场景。

用 mmnormalize 在边缘节点做秒级清洗,核心是把非结构化 syslog(比如设备告警、网络设备原始日志)在进入传输链路前就转成带字段的结构化格式,避免后端解析压力。它不依赖外部服务、无网络延迟、资源占用极低,特别适合 CPU 和带宽受限的边缘场景。
确认环境与加载模块
确保 rsyslog 版本 ≥ 8.20(推荐 v8.2101+),旧版本 mmnormalize 功能不全或存在解析 bug。
- 检查是否已编译支持:
rsyslogd -v | grep mmnormalize,输出含mmnormalize表示可用 - 在
/etc/rsyslog.d/10-mmnormalize.conf中显式加载:module(load="mmnormalize") - 无需重启,但需确保该文件被主配置包含(
$IncludeConfig /etc/rsyslog.d/*.conf默认已启用)
编写轻量级规则集(.rule 文件)
mmnormalize 不写正则,而是用类 DSL 的 规则语法 提取字段。对边缘设备常见指纹(如华为交换机 trap、锐捷 AP 上线日志、Zabbix agent 告警),一条规则可覆盖一类日志。
- 新建规则文件:
/etc/rsyslog.d/rules/edge.rule - 示例:解析一条典型锐捷 AP 日志
rule=: %time:char-to:" "% %host:word% %tag:word%: %msg:rest%
匹配:May 21 14:22:03 RG-AP520-01 RTK_AP: AP[192.168.10.55]上线
→ 提取$!time,$!host,$!tag,$!msg四个字段 - 多行日志?用
rule=: %line1:rest% %line2:rest%或配合imfile的readMode="2"处理
在日志流中嵌入清洗动作
不是所有日志都需清洗——只对指定来源或 facility 应用 mmnormalize,避免全局开销。
- 定义清洗规则集:
ruleset(name="clean_edge") {<br> action(type="mmnormalize" ruleBase="/etc/rsyslog.d/rules/edge.rule")<br> # 后续可接字段重命名、过滤等操作<br>} - 绑定到输入源(例如监听某 UDP 端口接收的网络设备日志):
input(type="imudp" port="5140" ruleset="clean_edge") - 清洗后直接转发 JSON:
template(name="json_clean" type="list") {<br> constant(value="{")<br> property(name="$!time" format="json") constant(value=",")<br> property(name="$!host" format="json") constant(value=",")<br> property(name="$!msg" format="json")<br> constant(value="}")<br>}
再用omfwd发往 Logstash 或 Kafka,格式即为标准 JSON
验证与调优要点
边缘节点资源紧张,清洗必须“零失败、低延迟、可观测”。
- 开启调试日志临时排障:
rsyslogd -dn 2>&1 | grep mmnormalize,观察是否命中规则、有无 parse error - 规则未命中?优先检查时间戳格式、空格数量、冒号位置——mmnormalize 对空白和标点敏感,建议先用
logger "test log line"手动触发测试 - 性能瓶颈?禁用
impstats模块外的其他插件;单条规则处理耗时应稳定在 - 字段名冲突?用
$!{my_field}显式命名,避免覆盖内置属性如$msg











