我有一个设置,可以总结如下:
service --> syslog-ng relay --> syslog-ng server
在syslog-ng服务器上,我将按如下方式组织日志:
/var/log/ ----> syslog-ng server local log files... \--> ${FROM_HOST}/ \---> Syslog-ng relay host log files... \---> ${HOST}/ \---> Service log files...
syslog-ng服务器上本地生成的日志 。 我在syslog-ng服务器主机上创build了以下configuration:
@version: 3.7 @include "scl.conf" options { dns-cache-hosts("/etc/hosts"); keep-hostname(yes); use-dns(persist_only); }; ...(removed)... # syslog-ng server local logs, works fine. log { source(local_src); local_file(); }; # syslog-ng relays, never matches. log { source(remote_src); filter { host("${HOST_FROM}", type(string)); }; local_file(subdir("${HOST_FROM}/")); }; # Services, works fine but also matches syslog-ng relays. log { source(remote_src); filter { not host("${HOST_FROM}", type(string)); }; local_file(subdir("${HOST_FROM}/$(sanitize $HOST)/")); };
有关信息local_file()是一个自定义日志块,它以存储日志条目的子目录作为参数。
host()filter被描述为将其参数与$ {HOST}进行比较。 我的想法是用来检查$ {HOST} (syslog消息的作者)和$ {HOST_FROM} (syslog消息的最后一跳):
syslog-ng中继生成。 但是,即使生成的path在$ {HOST}和$ {HOST_FROM}的值之间没有任何区别,testinghost("${HOST_FROM}", type(string))总是失败(例如,给定继电器名为therelay ,继电器日志将存储在/ var / log / therelay / therelay / ( / var / log / $ {HOST_FROM} / $(sanitize $ HOST)/ )的扩展。
我尝试删除消毒,将该模式解释为正则expression式,而不是原始string,在模式的开始和结尾处添加.* ,而在正则expression式中,将所有这些testing重新replace为host("${HOST_FROM}")通过match("${HOST_FROM}", value(HOST)) ,但似乎没有工作。
实际上,甚至host("${HOST}") (比较$ {HOST}和它自己)似乎永远不会匹配。
用过filter { host(".*"); };replace过滤filter { host(".*"); }; filter { host(".*"); }; 然而正确地强制这个条目匹配。
这是预期的行为? 我如何比较$ {HOST}和$ {HOST_FROM}的内容 ?
我不确定这是否是最好的答案,所以我现在就把问题留给我。
似乎macros在filter函数中没有扩展,很可能是由于速度优化,因为在这种情况下需要使用“稍慢”的特定语法。
host("${HOST_FROM}")只能匹配一个名字为$ {HOST_FROM}的主机,这在正常情况下不太可能发生。
正确的testing似乎是下面定义的filter:
filter { "${HOST}" == "${HOST_FROM}" };
虽然这个语法可能效率不高,但我认为这只是比较两个macros的内容的方法。