所以我对rsyslog非常陌生(最近从syslog-ng切换)我真的很喜欢我可以拥有动态文件名…我的工作最近开始使用docker并且他们在syslogtag中发送了很多字段给a远程主机.因此,我没有为每个实例设置过滤器,而是尝试编写动态过滤器来解析相关详细信息并将其放入自己的日志/目录,例如/ var / log / docker / app name / syslog.log
当他们在字段之间提供适当的分隔符时,我有’app name’工作但是当他们没有使用正确的分隔符时,正则表达式返回** NO MATCH **并将所有内容放到’/ var / log / docker / ** NO MATCH ** / syslog.log’.使用** NO MATCH **目录不是问题,但是将每个远程主机分组在一个文件中.有没有办法测试正则表达式是否返回不匹配,然后将文件名从’syslog.log’更改为’%hostname%.log’?
解决方法:
我不是专家,但你可以从这开始:你将需要重复你的正则表达式(我不知道如何评估模板以获得** NO MATCH **字符串).例如,假设您的“appname”部分与正则表达式[a-z]匹配:那么您可以编写
$template nomatch,"/var/log/docker/nomatch/%hostname%.log"
if (not re_match($msg, "[a-z]+:")) then {
action(type="omfile" dynaFile="nomatch")
stop
}
$template描述了您想要的文件名,if尝试查找匹配项,然后执行写入文件的操作,而不进一步处理此消息.
action()参数在RainerScript中描述为here.
标签:rhel,linux,filter,rsyslog
来源: https://codeday.me/bug/20190815/1661925.html