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

0xC*_*22L 6 configuration rsyslog syslog

这与我在此之前的问题有些相关。

我有三个文件,/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
Run Code Online (Sandbox Code Playgroud)

替换~stopas running rsyslogdwith-N1如手册页中所述,并在故障排除步骤中给出警告,说~is deprecated inavor or stop,这意味着可用的(官方!)文档似乎已过时/落后。

现在的想法是,任何以 为前缀的消息ipt:都将进入命名的日志文件,并且没有其他日志文件会收到这些行(我也尝试过contains而不是startswith)。这尤其syslogkern.log中提到50-default.conf不应该再收到这些消息:

auth,authpriv.*            /var/log/auth.log
*.*;auth,authpriv.none     -/var/log/syslog
kern.*                     -/var/log/kern.log
Run Code Online (Sandbox Code Playgroud)

我阅读了 rsyslog 文档,但是基于属性的过滤器的文档(也在这里)并不是最有启发性的。文档中给出的示例(也可以在其他地方找到)及其 Wiki 给出了一个类似的示例

# 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
& ~
Run Code Online (Sandbox Code Playgroud)

虽然文档中的示例与我的两行代码不太接近,但它仍然解释了~更好的含义。

我究竟做错了什么?

如果有人可以回答是否有组合选择器和属性的方法,则加分。例如:

:msg, startswith, "ipt:" kern.* /var/log/iptables.log
Run Code Online (Sandbox Code Playgroud)

注意:我使用 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
Run Code Online (Sandbox Code Playgroud)

我还应该补充一点,从我看到的行为中,我可以推断出过滤器有效果,因为它清楚地/var/log/iptables.log按预期写入文件。但是,将消息写入该特定文件后,消息不会按预期丢弃。

这是一个示例行,它以所有方式结束kern.logsyslogiptables.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
Run Code Online (Sandbox Code Playgroud)

小智 0

不确定你是否解决了它。我没有详细介绍所有细节,但 rsyslog 可以根据某些配置以不同的方式发送消息。例如,它可以同时发送到所有条件,或者可以发送到第一个条件,然后发送到第二个条件,依此类推。如果您的设置是同时发送给所有人,则停止将没有实际意义。尝试寻找 rsyslog 异步/同步/并行,特别是直接/链表类型的队列,它们会改变 rsyslog 流的方式。