当前位置:首页 > 文章列表 > 文章 > linux > Linux systemd-journald 持久化日志的配置方法

Linux systemd-journald 持久化日志的配置方法

来源:17golang原创 2026-10-17 08:15:06 0浏览 收藏

我排查 Linux 服务重启后的问题时,最怕看到的不是报错,而是“昨天的日志已经不在了”。很多机器上的 systemd-journald 并没有坏,只是日志还停留在运行时目录,重启后自然无法继续追溯。要让日志跨重启保留,关键是把存储模式、目录位置和轮转边界一起设计。

本文只讨论三件事:怎样启用持久化目录,怎样确认运行时日志已经刷新到磁盘,以及怎样用空间和时间参数控制 journal 文件增长。示例配置是可改造的生产骨架,不代表已经在某台机器上执行过。

官方参考地址:https://www.freedesktop.org/software/systemd/man/latest/journald.conf.html

先把 /run 和 /var 的日志职责分开

systemd-journald 的 Storage= 决定日志保存在哪里。volatile 只使用内存中的 /run/log/journal;persistent 优先写入磁盘上的 /var/log/journal,在早期启动或磁盘不可写时才回退到运行时目录;auto 则根据 /var/log/journal 是否存在来选择持久化或易失模式。

这也是“配置明明是 auto,为什么仍然没有历史日志”的常见原因:目录不存在时,auto 的行为更接近 volatile。如果你明确要求跨重启保存,使用 Storage=persistent 更容易读懂,也不依赖目录是否被提前创建。

systemd-journald 从运行时目录到持久化目录的存储边界静态说明图
图1:systemd-journald 存储目录与刷新组件的结构说明图,不是终端或运行截图。

用 drop-in 配置持久化存储

官方文档建议使用 *.conf.d drop-in 覆盖本地配置。这样不会直接改动发行版提供的主配置文件,后续查看时也能立刻知道哪些参数是本机的运维决定。

# 创建本地 drop-in 目录,避免直接改发行版主配置文件
sudo install -d -m 0755 /etc/systemd/journald.conf.d

# 写入持久化存储配置;文件名靠后的片段通常拥有更高的覆盖优先级
sudo tee /etc/systemd/journald.conf.d/60-persistent.conf > /dev/null 

这里的关键不是“重启一次服务”本身,而是让配置读取、目录可写和日志刷新形成闭环。journalctl --flush 会请求 journald 把 /run/log/journal 中暂存的数据移到 /var/log/journal;如果持久化存储没有生效,它不会凭空创建一个可用的磁盘日志链路。

目录创建与启动早期日志要怎么处理

如果系统采用 Storage=auto,创建 /var/log/journal 本身就会改变存储选择;如果已经明确写了 Storage=persistent,目录仍然要保证存在且可写。常见的做法是交给 systemd 的临时文件规则创建目录:

# 按 systemd 的目录与权限规则创建持久化 journal 目录
sudo systemd-tmpfiles --create --prefix=/var/log/journal

# 重新加载并刷新,覆盖“配置已改但旧日志还在 /run”这类场景
sudo systemctl restart systemd-journald
sudo journalctl --flush

# 查看 journal 文件当前占用;该命令只读,不会主动删除日志
sudo journalctl --disk-usage

启动早期的日志可能先写到 /run/log/journal,等磁盘和目标目录可用后再转移。官方文档把这个动作交给 systemd-journal-flush.service,手动执行 --flush 适合配置变更后的明确收尾。不要把“能看到当前日志”误判为“日志已经跨重启持久化”。

轮转边界:空间限制和时间限制是两套规则

持久化之后,新的问题通常是磁盘会不会被日志慢慢吃满。SystemMaxUse= 限制持久化 journal 总体最多占用多少空间,SystemKeepFree= 要求为其他数据保留多少空闲空间,journald 会采用两者中更严格的限制。SystemMaxFileSize= 控制单个 journal 文件的上限,影响轮转粒度;SystemMaxFiles= 控制保留的文件数量。

如果团队有明确的留存期限,再考虑 MaxRetentionSec=。它按时间删除过旧的 journal 文件;不要只写一个很小的 SystemMaxUse 就假设一定能保留固定天数,因为实际天数还取决于日志写入量。

systemd-journald 空间限制、文件轮转与时间保留的静态关系说明图
图2:journal 文件、空间边界和时间保留之间的关系说明图,不是监控结果截图。
[Journal]
# 持久化日志最多使用 2G,同时尽量给系统保留 4G 空间
Storage=persistent
SystemMaxUse=2G
SystemKeepFree=4G

# 控制单文件大小与文件数量,让空间回收更有粒度
SystemMaxFileSize=128M
SystemMaxFiles=12

# 有明确合规留存要求时再启用时间上限;单位支持 day、week 等
MaxRetentionSec=30day

这些设置会影响 journald 的持续维护,但不会把正在写入的活动文件当成普通旧文件立即删除。尤其是手动清理时,--vacuum-size、--vacuum-time 和 --vacuum-files 只针对归档文件;当前活动文件仍可能让 --disk-usage 看起来高于目标值。

手动清理时先轮转,再 vacuum

遇到磁盘告警,我更倾向于先把当前文件轮转,再执行一次受控清理,这样本次已经写入的内容也有机会进入归档集合。下面的命令是维护动作,不应替代长期配置:

# 先把当前活动文件标记为归档,再按时间和空间清理旧归档
sudo journalctl --rotate --vacuum-time=30d --vacuum-size=2G

# 只查看剩余 journal 占用;不访问线上页面,也不修改服务配置
sudo journalctl --disk-usage

--vacuum-time 适合按时间清理,--vacuum-size 适合给磁盘设置硬边界;两者可以一起用,最终会同时受限。生产环境里应先根据故障追溯需求决定留存时间,再用空间上限兜底,而不是看到磁盘紧张就无限制地删除。

最后用一张表复查配置边界

目标主要配置或命令容易误解的地方
跨重启保存Storage=persistent、/var/log/journalauto 依赖持久化目录是否存在
接住启动早期日志/run/log/journal、journalctl --flush暂存目录不等于最终持久化目录
限制磁盘占用SystemMaxUse、SystemKeepFree空间回收不会让活动文件立刻消失
控制轮转粒度SystemMaxFileSize、SystemMaxFiles文件数量限制主要作用于归档文件
一次性清理--rotate + --vacuum-time/size这是维护动作,不替代长期配置

相关问题

只设置 Storage=persistent 就够了吗?

还要确认 /var/log/journal 可写,并在配置变更后执行刷新。启动早期日志可能先在 /run/log/journal,需要由 flush 动作转移。

为什么 vacuum 后占用没有降到精确值?

vacuum 主要处理归档文件,活动文件仍会计入 --disk-usage;另外空间和文件数量限制只会删除符合条件的旧文件。

SystemMaxUse 和 MaxRetentionSec 应该二选一吗?

不必二选一。时间上限适合表达业务留存要求,空间上限适合保护磁盘,两者一起配置更容易覆盖高写入量场景。

我的经验是,先用 Storage=persistent 解决“重启后没有历史”的根因,再用 SystemMaxUse 和 SystemKeepFree 保护磁盘,最后按故障追溯周期决定是否加入时间留存。这样每个参数都有明确职责,排障时也不容易把目录、刷新和轮转混在一起。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Python wheel 构建元数据和依赖声明Python wheel 构建元数据和依赖声明
上一篇
Python wheel 构建元数据和依赖声明
Linux systemd 服务失败重启策略的配置
下一篇
Linux systemd 服务失败重启策略的配置
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之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模型性能。
    500次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    558次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    587次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    539次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    349次使用