我有一个设置,可以总结如下:
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
在位于其默认位置的服务器上本地生成的日志,/var/日志。- 在中继上生成的日志位于带有中继名称的子目录中,/var/log/${FROM_HOST}。
- 服务在其关联中继的子目录中生成的日志,/var/log/${FROM_HOST}/${HOST}
我在服务器主机上创建了以下配置syslog-ng
:
@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()
滤波器被描述为将其参数与${主机}。我的想法是用它来检查${主机}(系统日志消息的作者)和${HOST_FROM}(系统日志消息的最后一跳):
- 如果相等,则表明该消息已由中继生成
syslog-ng
。 - 如果它们不同,则表明该消息是由服务生成的。
然而,测试host("${HOST_FROM}", type(string))
总是失败,即使生成的路径没有显示出${主机}和${HOST_FROM}(例如,给定一个名为中继,中继日志将存储在下面/var/log/therelay/therelay/(扩大/var/log/${HOST_FROM}/$(清理 $HOST)/)。
我尝试删除清理,将模式解释为正则表达式而不是原始字符串,.*
在模式的开头和结尾添加正则表达式,用替换重新进行所有这些测试host("${HOST_FROM}")
,match("${HOST_FROM}", value(HOST))
但似乎没有任何效果。
事实上,即使host("${HOST}")
(比较${主机}与自身)似乎永远无法匹配。
但是,用正确的方式替换过滤器filter { host(".*"); };
会强制该条目匹配。
这是预期的行为吗?我如何比较${主机}和${HOST_FROM}?
答案1
我不确定这是否是最好的答案所以我暂时不回答我的问题。
似乎宏在过滤函数中没有扩展,很可能是因为速度优化,因为使用“稍微慢一点”在这种情况下似乎需要特定的语法。
host("${HOST_FROM}")
仅与名称为${HOST_FROM},这在正常情况下不太可能发生。
正确的测试似乎是下面定义的过滤器:
filter { "${HOST}" == "${HOST_FROM}" };
虽然这种语法可能效率较低,但我认为这是比较两个宏内容的唯一方法。