You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:05:21