You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置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规则:

  1. 先被111-elk-syslog.conf的*.*规则转发到远程ELK;
  2. 接着被系统默认规则(比如*.info)匹配,写入/var/log/messages。

两种方案都是切断其中一条路径,要么让日志在转发后直接终止,要么让默认规则跳过该日志,从而实现仅转发远程不写入本地的需求。

内容的提问来源于stack exchange,提问作者Finn Meinen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:24:26