我有一些由 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