当前位置:首页 > 文章列表 > 文章 > linux > journald 与 rsyslog 同时启用会存两份吗:转发链路和落盘边界怎么判断

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

来源:17golang原创 2026-09-04 00:22:36 0浏览 收藏

大部分主流带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
Linux journald、syslog socket 与 rsyslog 输入模块的静态关系图
图1:查看 journald、syslog socket、imuxsock 与 imjournal 的边界,判断同一消息是否存在两个进入 rsyslog 的入口。

再核对 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 自动消失。

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删除
Python packaging 26.2 的 pylock.toml 怎么接入:锁文件选择、环境复现与旧 pip 边界Python packaging 26.2 的 pylock.toml 怎么接入:锁文件选择、环境复现与旧 pip 边界
上一篇
Python packaging 26.2 的 pylock.toml 怎么接入:锁文件选择、环境复现与旧 pip 边界
Go slices.Collect 为什么会改变内存预期:迭代器消费与结果切片边界
下一篇
Go slices.Collect 为什么会改变内存预期:迭代器消费与结果切片边界
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    543次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    598次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    622次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    576次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    401次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码