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/syslog,imjournal则直接读取 journal 数据库。Storage=auto是否写入持久化日志,取决于/var/log/journal是否存在;volatile不代表 rsyslog 不会写文件。- 出现两条相同消息时,先排查
imjournal与imuxsock是否同时生效,再比对文件和来源字段。
先区分 journald 到 rsyslog 的两条输入路径
第一条路径是即时转发:journald 接收消息后,按 ForwardToSyslog=yes 发往 /run/systemd/journal/syslog,rsyslog 通过 imuxsock 接收。它传递的是传统 syslog 入口能理解的消息。
第二条路径是 imjournal 主动读取 journal 数据库。它不依赖消息刚好在 socket 上经过,rsyslog 晚启动时仍能读取已经保存的记录,并能拿到更多结构化字段。代价是读取 journal 数据库的开销通常高于 imuxsock。
因此,配置里同时有 ForwardToSyslog=yes、imuxsock 和 imjournal 时,同一消息可能从两个入口进入 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

再核对 journald 的 Storage 落盘位置
“存两份”还要问清楚是哪两份。journald 的 Storage=auto 在默认命名空间中会根据 /var/log/journal 是否存在,在持久化磁盘和易失性目录之间选择;Storage=persistent 优先使用 /var/log/journal,Storage=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 自动消失。

最后核对 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 写文件,也不能解决两个输入模块把同一消息处理两次。
-
426 收藏
-
387 收藏
-
242 收藏
-
238 收藏
-
402 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习