我可以使用 regexp 捕获的字符串到 rsyslog 路径中​​吗?

我可以使用 regexp 捕获的字符串到 rsyslog 路径中​​吗?

假设我想过滤日志以针对每个用户 ID 使用不同的文件,我可以为每个 uid 编写一条规则,如下所示:

if $msg contains 'uid=500' then /var/log/uid/500
if $msg contains 'uid=501' then /var/log/uid/501
if $msg contains 'uid=502' then /var/log/uid/502

我想通过使用正则表达式捕获来编写一行,如下所示:

if $msg contains 'uid=\([0-9]+\)' then /var/log/uid/\1

请问可以吗?

答案1

您可以使用财产替代者。将您的rsyslog.conf或类似的行定义为所需的文件名格式的模板,并在匹配输入行时在操作中使用它。例如,

$template myfile,"/var/log/uid/%msg:R,ERE,1,FIELD:.*?uid=([0-9]+).*--end%"
if (re_match($msg, "uid=[0-9]+")) then {
 action(type="omfile" dynaFile="myfile")
 stop
}

模板表示模板变量myfile是包含由正则表达式 (R) 匹配、扩展 (ERE)、组捕获 1 (1) 替换的属性的字符串msg(如果不匹配,则保留原始字段)。实际的正则表达式是这.*?uid=([0-9]+).*部分。这--end是序列的强制性部分%...:R,...--end%

下面的行是您想要匹配的行的常见 Rainer 脚本测试以及结果的放置位置。

相关内容