rsyslog 不存在名为 mmpstrucdata 的官方模块;实际处理 RFC 5424 结构化数据需加载 pmrfc5424 模块,并配合 imtcp 和 mmjsonparse 实现 SD 字段解析与 JSON 提取。

rsyslog 并没有名为 mmpstrucdata 的官方模块。该名称在 rsyslog 官方文档、源码(v8.2204+)、模块列表及所有已知发行版中均不存在。你可能混淆了以下几种情况:
实际可用的结构化数据相关模块
rsyslog 处理 RFC 5424 结构化数据(Structured Data, SD)依赖的是内置解析能力与标准输入/解析模块,而非独立的 “mmpstrucdata”:
-
pmrfc5424:这是 rsyslog 的核心 RFC 5424 解析器模块(必须显式加载),负责将接收到的 RFC 5424 消息正确拆解为 %$structured-data%、%$msg%、%$hostname% 等内建属性,并支持提取 SD-ELEMENT 中的键值对(如
[myapp@12345 action="login" result="success"]) - imtcp / imudp:网络输入模块,配合 pmrfc5424 才能真正识别并解析传入的 RFC 5424 流;若未启用 pmrfc5424,即使日志格式正确,SD 字段也会被当作普通字符串丢进 %msg%
-
mmjsonparse:当结构化数据以 JSON 形式嵌入 MSG 或 SD 中(如
[sd@12345 json="{\"src_ip\":\"10.0.1.5\",\"rule_id\":1001}"]),可用此模块进一步解析 JSON 内容为 rsyslog 属性
启用深度解析结构化安全日志的必要步骤
要真正实现对含复杂 SD 的安全日志(如防火墙、IDS、EDR 发送的 RFC 5424 日志)进行字段级提取和路由,需按顺序配置:
- 在
/etc/rsyslog.conf或/etc/rsyslog.d/10-security.conf开头加载必需模块:module(load="pmrfc5424")<br> module(load="imtcp")<br> module(load="mmjsonparse")
- 配置 TCP 输入并绑定解析器:
input(type="imtcp" port="6514" ruleset="parse-security" parser="pmrfc5424") - 定义规则集,在其中使用 SD 属性做条件判断或字段提取:
例如匹配特定 SD ID 并提取 key:if $structured-data contains "firewall@32473" then {<br> set $.src = $!firewall@32473!src_ip;<br> set $.dst = $!firewall@32473!dst_ip;<br> action(type="omfile" file="/var/log/security/firewall.log")<br> }
验证结构化数据是否被正确解析
仅靠日志外观无法确认 SD 解析成功。推荐用以下方式实测:
- 发送一条带 SD 的测试日志:
logger -i -t "testfw" -p local0.info '1 2026-05-19T20:02:00+08:00 myhost firewall 12345 - [firewall@32473 src_ip="192.168.1.100" dst_ip="10.5.0.20" action="block"] blocked port 22' - 在 rsyslog 配置中临时添加调试输出:
action(type="omfile" file="/tmp/rsyslog-debug.log" template="RSYSLOG_DebugFormat")
检查输出中是否出现类似$!firewall@32473!src_ip="192.168.1.100"的字段路径 - 使用
rsyslogd -N1检查配置语法,确保无pmrfc5424加载错误
常见失败原因与修复提示
结构化数据“看不见”或提取为空,通常因以下原因:
- 未加载
pmrfc5424模块 —— 这是最常见疏漏,会导致整个 SD 字段被吞进 %msg%,无法访问 - 输入模块未指定
parser="pmrfc5424"—— 即使模块已加载,不显式绑定,imtcp 仍走默认 BSD 解析路径 - SD 元素 ID 含非法字符(如空格、下划线、小数点)或未遵循
@数字格式 —— rsyslog 仅识别形如example@12345的合法 SD-ID - 日志实际是 RFC 3164 格式却误配为 RFC 5424 解析 —— 抓包查看原始流,确认首字段为
<PRI>1而非<PRI>May

















