我如何比较$ {HOST}和$ {HOST_FROM}(或为什么$ {HOST}!= $ {HOST})?

我有一个设置,可以总结如下:

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... 
  • 在位于默认位置/ var / logsyslog-ng服务器上本地生成的日志
  • logging在继电器上生成的中继目录名为/ var / log / $ {FROM_HOST}的子目录中。
  • 由服务在其关联的中继的子目录/ var / log / $ {FROM_HOST} / $ {HOST}中生成的日志

我在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的内容的方法。