rsyslog模板正则表达式编译失败,求排查解决方法
解决方案
核心问题是你使用了PCRE风格的非捕获组语法(?:...),但当前配置指定regex.type="ERE",rsyslog会使用POSIX扩展正则表达式,而POSIX ERE标准中并不支持非捕获组,这直接导致正则编译失败。
有两种简单的解决方式:
方式1:改用POSIX ERE兼容的语法
将非捕获组改为普通捕获组,然后把regex.submatch的值从1改为2(第一个捕获组会匹配[Info ]或[Error ]部分,第二个捕获组才是我们需要提取的日志内容)。
修改后的模板配置:
template(name="jsonFormat" type="list" option.jsonf="on") { property(outname="msg" name="msg" regex.expression="(\[Info\s*\]|\[Error\s*\])\s*(.*)" regex.type="ERE" regex.submatch="2" format="jsonf") }
方式2:切换为PCRE正则类型(需rsyslog支持)
如果你的rsyslog编译时已支持PCRE(或PCRE2),可以将regex.type改为PCRE,同时确保加载了对应的模块(比如module(load="pcre2"),具体模块名取决于rsyslog版本),这样就能直接使用原来的非捕获组正则:
module(load="imfile") module(load="pcre2") # 加载PCRE2模块,旧版本可能是pcre input(type="imfile" tag="mylog" file="/path/to/log/file.log") template(name="jsonFormat" type="list" option.jsonf="on") { property(outname="msg" name="msg" regex.expression="(?:\\[Info\\s*\\]|\\[Error\\s*\\])\\s*(.*)" regex.type="PCRE" regex.submatch="1" format="jsonf") } if ($syslogtag == "mylog") then { action(type="omfile" file="/path/to/output/file.log" template="jsonFormat") }
内容的提问来源于stack exchange,提问作者Florian
相关产品推荐
相关产品推荐

