无法通过syslog-ng排除特定日志消息发送至远程服务器
无法通过syslog-ng排除特定日志消息发送至远程服务器
看起来你的配置里有两个关键问题导致那条ntpd.的内核日志还是会跑到远程服务器上,咱们一步步拆解解决:
问题1:过滤器逻辑写反了
你定义的f_ntpd过滤器是:
filter f_ntpd { not match("ntpd." value(MESSAGE)); };
这个过滤器的作用是匹配那些不含"ntpd."的消息,而你实际想要的是排除含"ntpd."的消息,逻辑完全搞反了。应该把过滤器改成匹配要排除的内容:
filter f_ntpd { match("ntpd." value(MESSAGE)); };
问题2:日志路由范围太窄
你的当前log块只对devd日志应用了过滤逻辑,其他所有日志(包括那条kernel发出的ntpd.消息)根本没经过过滤就直接通过else分支发送到远程了。
修正后的完整配置示例
根据你的需求(devd日志排除ntpd后本地处理,其他日志排除ntpd后发远程),可以这样调整:
首先修正过滤器,再调整路由逻辑:
# 目标:匹配要排除的含"ntpd."的消息 filter f_ntpd { match("ntpd." value(MESSAGE)); }; # 可选:更精准匹配kernel发出的ntpd消息,避免误删其他日志 # filter f_kernel_ntpd { program("kernel") and match("ntpd." value(MESSAGE)); }; filter f_devd { program("devd"); }; destination lc_net { tcp("192.168.0.2" port(3000) log_fifo_size(1000)); }; # 本地存储devd日志的示例目的地 destination d_devd { file("/var/log/devd.log"); }; # 处理devd日志:保留不含ntpd的devd日志,存在本地 log { source(src); filter(f_devd); not filter(f_ntpd); # 排除含ntpd的devd日志 destination(d_devd); }; # 处理其他日志:排除含ntpd的消息,发送到远程 log { source(src); not filter(f_devd); not filter(f_ntpd); # 排除含ntpd的非devd日志(包括那条kernel日志) destination(lc_net); };
如果用精准的f_kernel_ntpd过滤器,只需要把上面的not filter(f_ntpd)替换成not filter(f_kernel_ntpd)即可,这样只会针对kernel发出的ntpd.消息生效,更安全。
最后一步:重启生效
修改完配置后,记得重启syslog-ng服务让配置生效:
service syslog-ng restart
备注:内容来源于stack exchange,提问作者Ilya Shmadchenko
相关产品推荐
相关产品推荐

