基于带有通配符的 IP 地址的 rsyslog 过滤

基于带有通配符的 IP 地址的 rsyslog 过滤

我有一些由 rsyslog 处理的 syslog 流量,我想设置过滤器来根据源设备的 IP 地址存储日志。我有大量设备,并且希望避免为每个设备创建规则。 IP 方案足够一致,我认为我可以用一条规则处理所有事情,但我很难让它工作。

以下是我试图完成的几个(失败的)示例:

:FROMHOST, regex, "10\.[0-9]+\.1\.2" -/var/log/test.log
& ~

或者

if ( re_match($fromhost-ip, '10\.[0-9]+\.1\.2') ) then { -/var/log/test.log }
& ~ 

基本上,这些设备的 IP 方案始终为 10.*.1.2,其中 * 是与设备位置相对应的 2 位数字。

有人可以告诉我我哪里出了问题吗?

谢谢你!

答案1

在找到运行 rsyslog 的调试选项后,我实际上能够自己发现解决方案。显然,您可以直接从控制台调用 rsyslogd,如下所示:

rsyslogd -d

这样做将显示所有规则解析的实时流。之后使用这个技巧进行反复试验后,我能够确定我的过滤规则失败了,因为需要几个部分,不仅仅是转义,而且双倍的逃脱了。这真的让我很惊讶。

这是我的最终规则:

:fromhost-ip, regex, "10\\.[0-9]\\+\\.1\\.2" -/var/log/test.log
& ~

这是几个成功示例的输出。请注意,+此处必须显示为转义,这很奇怪,因为如果将其插入官方,则找不到匹配项rsyslog 正则表达式测试器这边走:

Filter: check for property 'fromhost-ip' (value '10.1.1.2') regex '10\.[0-9]\+\.1\.2': TRUE

Filter: check for property 'fromhost-ip' (value '10.24.1.2') regex '10\.[0-9]\+\.1\.2': TRUE

如果有一天读到这篇文章的人感到好奇,这里是我的一些尝试和错误的例子,其中大多数都完全失败了:

Filter: check for property 'fromhost-ip' (value '10.1.1.2') regex '10.[0-9]+.1.2': FALSE

Filter: check for property 'fromhost-ip' (value '10.1.1.2') regex '^10.[0-9]+.1.2$': FALSE

Filter: check for property 'fromhost-ip' (value '10.1.1.2') regex '10\.[0-9]+\.1\.2': FALSE

Filter: check for property 'fromhost-ip' (value '10.1.1.2') regex '10\.1\.1\.2': TRUE

Filter: check for property 'fromhost-ip' (value '10.1.1.2') regex '10\.[0-9]\.1\.2': TRUE

Filter: check for property 'fromhost-ip' (value '10.1.1.2') regex '10\.[0-9]+\.1\.2': FALSE

相关内容