登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

journald 与 rsyslog 同时启用会存两份吗:转发链路和落盘边界怎么判断

来源:17golang原创

时间:2026-09-04 00:22:36 161浏览 收藏

大部分主流带systemd的Linux发行版默认同时启用journald和rsyslog服务时,同一条系统日志默认确实会被写入两份不同的存储位置,只有你手动调整转发链路规则或者落盘开关,才能避免重复存储。

默认无自定义配置的场景下两份日志独立存储互不覆盖,你不需要同时保留的话只要关掉其中一个的落盘配置,或者调整rsyslog的输入源过滤掉journald转发的重复内容即可。

服务器磁盘突然多出一份日志,最容易误判的就是“journald 和 rsyslog 都开着,所以一定双写”。实际要先看消息怎么进入 rsyslog,再看 journald 和 rsyslog 各自有没有落盘动作。两者可以组成一条转发链,也可以因为同时启用两个输入模块,让同一条消息被 rsyslog 处理两次。

要点速览
  • ForwardToSyslog=yes/run/systemd/journal/syslogimjournal 则直接读取 journal 数据库。
  • Storage=auto 是否写入持久化日志,取决于 /var/log/journal 是否存在;volatile 不代表 rsyslog 不会写文件。
  • 出现两条相同消息时,先排查 imjournalimuxsock 是否同时生效,再比对文件和来源字段。

先区分 journald 到 rsyslog 的两条输入路径

第一条路径是即时转发:journald 接收消息后,按 ForwardToSyslog=yes 发往 /run/systemd/journal/syslog,rsyslog 通过 imuxsock 接收。它传递的是传统 syslog 入口能理解的消息。

第二条路径是 imjournal 主动读取 journal 数据库。它不依赖消息刚好在 socket 上经过,rsyslog 晚启动时仍能读取已经保存的记录,并能拿到更多结构化字段。代价是读取 journal 数据库的开销通常高于 imuxsock

因此,配置里同时有 ForwardToSyslog=yesimuxsockimjournal 时,同一消息可能从两个入口进入 rsyslog。先检查:

grep -R "ForwardToSyslog" /etc/systemd/journald.conf /etc/systemd/journald.conf.d 2>/dev/null
grep -R "imjournal\|imuxsock" /etc/rsyslog.conf /etc/rsyslog.d 2>/dev/null
Linux journald、syslog socket 与 rsyslog 输入模块的静态关系图
图1:查看 journald、syslog socket、imuxsock 与 imjournal 的边界,判断同一消息是否存在两个进入 rsyslog 的入口。

再核对 journald 的 Storage 落盘位置

“存两份”还要问清楚是哪两份。journald 的 Storage=auto 在默认命名空间中会根据 /var/log/journal 是否存在,在持久化磁盘和易失性目录之间选择;Storage=persistent 优先使用 /var/log/journalStorage=volatile 只写 /run/log/journal。前者是内存文件系统,重启后不能当作长期副本。

这意味着即使 journald 只保留易失性数据,rsyslog 仍可能把收到的消息写到 /var/log/messages 或其他本地文件。反过来,journald 持久化且 rsyslog 只把消息发往远端,也不等于本机有两个文件副本。先看配置和实际占用:

grep -R "^Storage=" /etc/systemd/journald.conf /etc/systemd/journald.conf.d 2>/dev/null
ls -ld /run/log/journal /var/log/journal 2>/dev/null && journalctl --disk-usage

目录存在只是重要线索,最终还要结合 drop-in 优先级和 journalctl --disk-usage 的结果判断。修改 journald 配置后,也要留意已存在的持久化文件不会因为切换到 volatile 自动消失。

Linux journald 的 Storage、运行时目录、持久化目录与 rsyslog 文件输出关系图
图2:对照 /run/log/journal、/var/log/journal 与 rsyslog 文件输出,判断磁盘上到底保留了几套日志副本。

最后核对 rsyslog 的输入与输出规则

打开 /etc/rsyslog.conf/etc/rsyslog.d/*.conf,把每个输入模块和 action 画成一张小表。输入模块只回答“消息从哪里来”,输出动作才回答“消息写到哪里”。常见的 omfile 会产生本地文本文件,远程转发会产生另一台机器上的副本,omjournal 则会把 rsyslog 收到的消息重新写回 journal。

看到的配置说明优先核对
imjournal读取 journal 数据库是否又启用了 imuxsock
imuxsock读取 syslog socket是否由 journald 转发而来
omfile写本地文件文件路径和筛选条件
omjournal重新写入 journal是否形成回写环路

如果你的目标只是让 rsyslog 统一接收传统 syslog 消息,通常应选择一种入口;如果确实需要 imjournal 的结构化字段,就要明确关闭另一条重复入口,并为规则加上清楚的筛选条件。不要只删掉一个模块后直接重启,先保存当前配置,修改后用服务状态和抽样日志确认。

用文件大小与来源字段确认是否真的重复

看到两条相同文本,不足以证明有两套持久化副本。它可能是同一文件被两个输入模块重复写入,也可能是 journald 的一份二进制日志加 rsyslog 的一份文本日志,还可能只是远端汇聚系统再次展示了本机消息。

建议按三个层次确认:第一,用 journalctl --disk-usage 记录 journal 占用,用 du -sh /var/log/messages /var/log 2>/dev/null 观察 rsyslog 文件;第二,从同一时间段抽取几条消息,比较时间戳、主机名、SYSLOG_IDENTIFIER 和优先级;第三,暂时停用一个输入路径或收窄一条规则,再观察单个测试窗口内的计数变化。

修复后的验收标准很具体:目标消息只从一个预期入口进入 rsyslog;需要长期保存的落点数量与设计一致;重启后仍能查到的记录来自明确的持久化目录;远端转发则在接收端单独核对。rsyslog 的可靠转发还可能遵循 at-least-once 语义,网络中断后的重复发送要与本机双入口问题分开处理。

相关问答

只开启 rsyslog 就会关闭 journald 吗?

不会。两个服务可以同时运行,是否保留 journal 由 Storage 与实际目录决定,是否转发给 rsyslog 则由 ForwardToSyslog 或 rsyslog 的输入模块决定。

imjournal 和 imuxsock 应该二选一吗?

不是绝对二选一,但同一消息源同时走两者时要有明确过滤和去重设计。只需要传统 syslog 消息时,优先评估 imuxsock;需要 journal 结构化字段时,再保留 imjournal 并关闭重复入口。

Storage=volatile 能解决磁盘日志重复吗?

只能减少 journald 的持久化副本,不能阻止 rsyslog 的 omfile 写文件,也不能解决两个输入模块把同一消息处理两次。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>