假设我想过滤日志以针对每个用户 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 脚本测试以及结果的放置位置。