rsyslog 不提供名为 “munus” 的解析器,该名称系拼写错误或与其他工具混淆;其原生支持 pcre2、mmnormalize、mmjsonparse 等模块处理非 linux 设备日志,推荐结合 syslog-ng、vector 或 elk 等工具链应对复杂格式。

rsyslog 本身并不提供叫 “Munus” 的解析器——目前官方文档、稳定版本(如 v8.2110、v9.0)及主流发行版仓库中均无此模块或功能。你提到的名称可能是拼写误差、混淆了其他工具(如 Muon、Logstash 的 mutate、Fluentd 的 parser),或是误将某个第三方插件/内部项目名当作 rsyslog 原生组件。
rsyslog 实际支持的日志解析能力
rsyslog 处理非 Linux 设备(如网络设备、防火墙、Windows 事件转发器、IoT 网关)发来的复杂格式日志,依赖以下原生机制:
- 消息预处理:使用 $EscapeControlCharactersOnReceive 和 $RepeatedMsgReduction 控制原始输入行为,避免控制字符干扰后续解析
-
基于正则的提取:通过
pcre2模块(需启用$ModLoad mmregex)对原始消息字段做匹配与赋值,例如从 Cisco ASA 日志中提取 src_ip、dst_port -
模板化结构化:用
$template+property(如%msg%、%hostname%、%timegenerated%)重排日志格式,适配 JSON、CEF、LTSV 等通用格式 -
模块化解析器:rsyslog v8.33+ 支持
mmjsonparse(解析 JSON)、mmparquet(实验性)、mmnormalize(基于 liblognorm 规则),其中mmnormalize是处理非标准文本日志最常用的方式
处理非 Linux 设备日志的典型流程
以一台 FortiGate 防火墙发送的 syslog(含自定义字段、空格不规则、时区混杂)为例:
- 确保服务端监听 UDP/TCP 514 并禁用 DNS 反查:
RSYSLOGD_OPTIONS="-r -x"(Debian/Ubuntu)或修改/etc/default/rsyslog - 在
/etc/rsyslog.d/fortigate.conf中加载解析模块:$ModLoad mmnormalize - 定义 lognorm 规则文件(如
/etc/rsyslog.d/rules/fortigate.rule),内容类似:rule=:%ts:date-rfc3164% %host:word% date=%date:date-rfc3164% time=%time:hour:minute:second% devname=%devname:word% devid=%devid:word% logid=%logid:number% type=%type:word% subtype=%subtype:word% level=%level:word% vd="%vd:word%" eventtime=%eventtime:number% srcip=%srcip:ipv4% dstip=%dstip:ipv4% srcport=%srcport:number% dstport=%dstport:number% - 应用规则并输出为结构化格式:
if $programname == 'fortigate' then { action(type="mmnormalize" ruleBase="/etc/rsyslog.d/rules/fortigate.rule") template="RSYSLOG_ForwardFormat" }
替代方案建议(当 rsyslog 原生能力不足时)
若日志格式高度动态(如嵌套 JSON、多行堆栈、协议封装体),rsyslog 不是最佳选择:
- 前置轻量级解析:用
syslog-ng或vector接收原始日志,完成字段提取与标准化后再转给 rsyslog 存储 - 后端集中解析:将原始日志暂存为文本或 JSON 文件,由 ELK / Loki / Grafana Alloy 等系统统一做 pipeline 解析
- 自定义输入模块:用 rsyslog 的
imtcp+omprog调用 Python 脚本做定制解析(需启用omprog模块)
rsyslog 的强项是高吞吐、低延迟、可靠路由和基础结构化,而非深度语义解析。遇到复杂格式,优先考虑组合工具链,而非强行扩展单一组件。











