配置rsyslog向远程ELK-Stack发送日志但不写入messages文件
解决rsyslog仅转发远程不写入本地messages的问题
这个问题我之前帮人排查过,核心是rsyslog的消息处理逻辑在搞鬼:你的外部日志被标记为local3设施后,既被你配置的远程转发规则发送到ELK,又触发了系统默认的日志写入规则,导致日志同时出现在远程服务器和本地/var/log/messages里。下面给你两个精准的解决方案,按需选择:
方案一:针对目标日志单独处理并终止后续流程
这个方法更精准,只针对你导入的外部日志生效,不会影响其他系统日志的正常处理。修改你的101-external-log.conf,在监控配置后添加转发规则和终止指令:
$ModLoad imfile $InputFileName PATH_TO_LOGFILE $InputFileTag FILE_TAG $InputFileStateFile FILE_TAG $InputFileFacility local3 $InputRunFileMonitor # 将local3设施的日志发送到远程ELK服务器 local3.* @@IP_OF_THE_SYSLOGSERVER:514 # 终止后续处理流程,避免日志被写入本地messages local3.* ~
注:
~是rsyslog传统的终止处理指令,在较新版本的rsyslog中也可以用& stop,效果完全一致。
修改完成后重启rsyslog服务:
systemctl restart rsyslog
方案二:修改默认规则排除目标设施
如果你的环境中所有local3设施的日志都不需要写入messages,可以直接修改系统默认的日志写入规则。找到rsyslog的默认配置文件(通常是/etc/rsyslog.d/50-default.conf,不同发行版可能略有差异),找到对应messages的行,添加local3.none排除该设施:
# 原规则 # *.info;mail.none;authpriv.none;cron.none /var/log/messages # 修改后规则 *.info;mail.none;authpriv.none;cron.none;local3.none /var/log/messages
同样重启rsyslog服务生效:
systemctl restart rsyslog
为什么原来的配置会出问题?
你的101-external-log.conf把外部日志标记为local3设施后,这条日志会依次经过所有rsyslog规则:
- 先被
111-elk-syslog.conf的*.*规则转发到远程ELK; - 接着被系统默认规则(比如
*.info)匹配,写入/var/log/messages。
两种方案都是切断其中一条路径,要么让日志在转发后直接终止,要么让默认规则跳过该日志,从而实现仅转发远程不写入本地的需求。
内容的提问来源于stack exchange,提问作者Finn Meinen
相关产品推荐
相关产品推荐

