这与我之前的问题有些相关这里。
我有三个文件,/etc/rsyslog.d
其中包含/etc/rsyslog.conf
:
00-iptables.conf
50-default.conf
postfix.conf
第一个是我创建的。我的假设是/曾经是,由于命名,它将包含在之前50-default.conf
,但我也尝试将过滤器行直接放入50-default.conf
并删除我的自定义文件(00-iptables.conf
)。
:msg, startswith, "ipt:" /var/log/iptables.log
& stop
替换~
为stop
as running rsyslogd
with ,-N1
如手册页中所述,并且在故障排除步骤中给出警告,表示~
不推荐使用 或stop
,这意味着可用的(官方!)文档似乎已过时/落后。
现在这里的想法是,任何前缀为的消息ipt:
都将进入指定的日志文件,并且其他日志文件不会收到这些行(我也尝试过contains
而不是startswith
)。特别是syslog
在不应再收到这些消息kern.log
中提到:50-default.conf
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
kern.* -/var/log/kern.log
我阅读了 rsyslog 文档,但是文档基于属性的过滤器(还这里)并不是最有启发性的。文档中给出的示例(也在其他地方找到)和他们的维基给出了类似的例子:
# From documentation
*.* /var/log/allmsgs-including-informational.log
:msg, contains, "informational" ~
*.* /var/log/allmsgs-but-informational.log
# From Wiki
:syslogtag, startswith, "MSWinEventLog#011" /var/log/messages;fixsnareFormat
& @192.168.1.8;fixsnareForwardFormat
& ~
虽然文档中的示例与我的两行代码不太接近,但它仍然解释了~
更好的含义。
我究竟做错了什么?
如果有人能回答是否有办法将选择器和属性结合起来,那就加分了。例如:
:msg, startswith, "ipt:" kern.* /var/log/iptables.log
注意:我使用 7.4.4 版本rsyslog
。是的,我service rsyslog restart
在更改后做了,然后等待它生效。
编辑
更多信息。当在调试模式( )下运行守护程序时RSYSLOG_DEBUG=LogFuncFlow RSYSLOG_DEBUGLOG=~/rsl.log $(which rsyslogd) -f /etc/rsyslog.conf -d
,我可以看到优化后的规则集如下所示,这似乎表明它正是我想要的方式(为简洁起见,删除了前导前缀):
ruleset 'RSYSLOG_DefaultRuleset' after optimization:
ruleset 0x214a640: rsyslog ruleset RSYSLOG_DefaultRuleset:
PROPFILT
Property.: 'rawmsg'
Operation: 'contains'
Value....: 'ipt:'
THEN
ACTION 0x215c070 [builtin:omfile:/var/log/iptables.log]
STOP
END PROPFILT
PRIFILT 'auth,authpriv.*'
pmask: X X X X FF X X X X X FF X X X X X X X X X X X X X X
ACTION 0x215e840 [builtin:omfile:/var/log/auth.log]
END PRIFILT
PRIFILT '*.*;auth,authpriv.none'
pmask: FF FF FF FF X FF FF FF FF FF X FF FF FF FF FF FF FF FF FF FF FF FF FF FF
ACTION 0x215f030 [builtin:omfile:-/var/log/syslog]
END PRIFILT
/var/log/iptables.log
我还应该补充一点,从我看到的行为,我可以推断出过滤器有效果,因为它清楚地按预期写入文件。但是,将消息写入该特定文件后,消息不会按预期删除。
kern.log
这是一个示例行,它以所有,syslog
而iptables.log
不是仅后者结束。出于隐私原因,详细信息已被编辑:
Jun 1 02:23:01 hostname kernel: [70025.211497] ipt:drop IN=eth0 OUT=virbr0 MAC=dd:cc:bb:aa:99:88:77:66:55:44:33:22:11:00 SRC=9.8.7.6 DST=1.2.3.4 LEN=60 TOS=0x00 PREC=0x00 TTL=47 ID=59201 DF PROTO=TCP SPT=47626 DPT=23 WINDOW=4380 RES=0x00 SYN URGP=0
答案1
为什么不使用 RainerScript?代替设施选择器,匹配$syslogfacility-text
。实际上,这结合了选择器和属性。
if ($msg startswith 'ipt:' and $syslogfacility-text == 'kern') then {
action(type="omfile" file="/var/log/iptables.log")
stop
}
另请注意,Rsyslog 文档表明版本 7 树已过时,应该不是使用 (http://www.rsyslog.com/doc/v7-stable/)。
答案2
不确定你是否解决了它。我没有详细介绍所有细节,但 rsyslog 可以根据某些配置以不同的方式发送消息。例如,它可以同时发送到所有条件,或者可以发送到第一个条件,然后发送到第二个条件,依此类推。如果您的设置是同时发送给所有人,则停止将没有实际意义。尝试寻找 rsyslog 异步/同步/并行,特别是直接/链表类型的队列,它们会改变 rsyslog 流的方式。