我们从无法控制的转发器获取 syslog-ng 反馈。
问题是他们使用的是旧版本 (RHEL 6),尽管他们将 keep_hostnames 设置为“yes”(将 chain_hostnames 设置为“no”),但还是不起作用。他们的 feed 仍然将中继的 IP 和时间戳附加到消息中。
除了为这个单一输入创建一个全局过滤器来撕掉那个领先的 IP 和时间戳之外,我不知道还有其他方法可以做到这一点。
有人有什么建议吗?我很惊讶我无法告诉我的 syslog-ng 忽略所有附加的中继链。
答案1
我的解决方案并不吸引人,但确实有效。如果有人知道更好的方法,我很乐意听取。
这是我所做的。因此,在这种情况下,我试图过滤掉 IIS 日志(s_net 只是监听端口 514 的 tcp/udp)。因此,以下是我的 iis.conf 文件中的内容,位于 conf.d 内
parser p_iis_pattern_db {
db_parser(file("/etc/syslog-ng/patterndb.d/strip_header.xml"));
};
filter f_iis {
match("iis", value(".classifier.class"));
};
rewrite r_iis {
set("${real_sender}", value("HOST"));
set("iis", value("PROGRAM"));
};
destination d_iis {
file("/nfs/syslog/iis/$YEAR/$MONTH/$DAY/${real_sender}/$YEAR-$MONTH-$DAY-$HOUR-${real_sender}-$PROGRAM.log"
template("${orig_sender}${msg}\n"));
};
log {
source(s_net);
parser(p_iis_pattern_db);
filter(f_iis);
rewrite(r_iis);
destination(d_iis);
flags(final);
};
然后,我在 patterndb.d(strip_header.xml)中有一个模式文件,它看起来像这样:
<patterndb version='3' pub_date='2017-02-07'>
<ruleset name='strip_sender' id='strip_leading_sender'>
<rules>
<rule id='iis' class='iis'>
<patterns>
<pattern>@ESTRING:datestamp: @@IPv4:real_sender@ iis - - - @ANYSTRING:msg@</pattern>
</patterns>
</rule>
</rules>
</ruleset>
</patterndb>
我更愿意根据 MACRO 值而不是消息进行过滤,因为我认为这可能相当昂贵;它必须检查每个包的消息。由于数据来自运行旧版本 syslog-ng 的中继,我在该中继上执行了数据的出站标记,并且 keep-hostname/chain-hostname 选项不起作用。
我的另一个担心是,当我开始添加非中继源时,这会很快变得混乱。我可能必须做整件事,以某种方式命名 conf 文件,以确保它们以正确的顺序执行,以节省 CPU 周期(是按字母顺序吗?)。