在rsyslog配置中使用正则提取字段失败,数据停止发送
rsyslog正则提取字段失效问题解决
问题原因
你使用的正则表达式(?<=\sIN=)(.*?)(?=\s)依赖**后行断言(lookbehind)**和非贪婪匹配,但rsyslog采用的POSIX扩展正则表达式(ERE)不支持零宽断言(包括后行、先行断言),同时非贪婪匹配的.*?写法在rsyslog正则引擎中兼容性有限,这直接导致配置解析失败,日志数据停止发送。
修正方案
改用不依赖零宽断言的正则写法,直接匹配字段前缀+捕获目标值,利用\S+匹配无空格的字段值(日志中这类字段值本身不含空格,匹配更高效准确)。
各字段适配正则示例
- 提取IN字段:
(^|\s)IN=(\S+)((^|\s)兼容字段在行首的场景) - 提取MAC字段:
\sMAC=(\S+) - 提取SRC字段:
\sSRC=(\S+)
完整rsyslog模板配置
template(name="firewallLogJson" type="list") { constant(value="{") property(outname="IN" name="msg" regex.expression="(^|\s)IN=(\S+)" regex.submatch="2" regex.type="ERE" format="jsonf" onEmpty="keep") constant(value=", ") property(outname="MAC" name="msg" regex.expression="\sMAC=(\S+)" regex.submatch="1" regex.type="ERE" format="jsonf" onEmpty="keep") constant(value=", ") property(outname="SRC" name="msg" regex.expression="\sSRC=(\S+)" regex.submatch="1" regex.type="ERE" format="jsonf" onEmpty="keep") constant(value="}") }
注意:如果IN字段固定出现在空格之后,可简化正则为
\sIN=(\S+),此时子匹配取第1个分组(regex.submatch="1");若IN可能在行首,保留(^|\s)时需指定子匹配为第2个分组。
内容的提问来源于stack exchange,提问作者ZiemowitP
相关产品推荐
相关产品推荐

