为什么 rsyslogd 不遵守 rsyslog.d 中的以下行

为什么 rsyslogd 不遵守 rsyslog.d 中的以下行

这与我之前的问题有些相关这里

我有三个文件,/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

替换~stopas running rsyslogdwith ,-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这是一个示例行,它以所有,syslogiptables.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 流的方式。

相关内容