我们遇到了一个问题,即我们有一个设备类型日志,其主机名为 slot1/devicename。不幸的是,当日志写入磁盘时,只有 slot1 被写入;由于我们有许多设备,这让我们无法知道哪个设备发送了日志。我们进行了数据包捕获以确认在网络上,主机名为 slot1/devicename
options {
long_hostnames(off);
sync(0);
perm(0640);
stats(3600);
chain_hostnames(on);
keep_hostname(on);
create_dirs(on);
bad-hostname("^[0-9][0-9]*$");
}
source s_in {
udp();
tcp(max-connections(255)); };
}
destination s_files {
file (
"/opt/syslog-ng/$HOST/$FACILITY-$HOUR.log"
template("$DATE $HOST $MSG\n")
template_escape(no)
);
};
log { source(s_in); destination(s_files); }
这是 SUSE Linux Enterprise Server 11 SP4 上的 syslog-ng-2.0.9-27.34.39.2
答案1
我的猜测是 syslog-ng 不希望主机名包含斜线,因此它假定该字符串的第一部分是主机名。它要么删除第二部分,要么假定它属于消息的下一个字段。检查 $PROGRAM 宏的值,它可能包含您要查找的设备名称。(如果没有,还请检查 $HOST_FROM、$FULLHOST_FROM 和 $FULLHOST 宏。)
如果是,您可以将目标文件名修改为 /$HOST-$PROGRAM/,或类似名称(并且可能还为此设备使用过滤器和单独的日志路径,以便新模板不会弄乱正常工作的设备的目录名称)。
如果这不能解决问题,较新版本的 syslog-ng 可以通过多种方式解析和重写日志消息来解决这个问题,但为此您需要安装较新的版本(2.0.9 已经过时了)。
HTH,罗伯特