ubuntu 修改 journal 日志保存目录

1.查看日志保存路径

方法1

看 systemd-journald 进程,可以看到日志保存到哪里了,异常的是没有相关信息

bash 复制代码
systemctl status systemd-journald
● systemd-journald.service - Journal Service
     Loaded: loaded (/lib/systemd/system/systemd-journald.service; static)
     Active: active (running) since Mon 2024-11-18 18:22:33 CST; 1 year 6 months ago
TriggeredBy: ● systemd-journald-dev-log.socket
             ● systemd-journald-audit.socket
             ● systemd-journald.socket
       Docs: man:systemd-journald.service(8)
             man:journald.conf(5)
   Main PID: 40179 (systemd-journal)
     Status: "Processing requests..."
      Tasks: 1 (limit: 49151)
     Memory: 692.4M
        CPU: 5h 46min 58.519s
     CGroup: /system.slice/systemd-journald.service
             └─40179 /lib/systemd/systemd-journald

Notice: journal has been rotated since unit was started, output may be incomplete.

正常的应该输出日志保存目录,如下:

bash 复制代码
systemctl status systemd-journald
● systemd-journald.service - Journal Service
     Loaded: loaded (/lib/systemd/system/systemd-journald.service; static)
     Active: active (running) since Fri 2026-06-05 14:53:45 CST; 1h 44min ago
TriggeredBy: ● systemd-journald.socket
             ● systemd-journald-audit.socket
             ● systemd-journald-dev-log.socket
       Docs: man:systemd-journald.service(8)
             man:journald.conf(5)
   Main PID: 219993 (systemd-journal)
     Status: "Processing requests..."
      Tasks: 1 (limit: 49151)
     Memory: 21.5M
        CPU: 4.926s
     CGroup: /system.slice/systemd-journald.service
             └─219993 /lib/systemd/systemd-journald

Jun 05 14:53:45 m2 systemd-journald[219993]: Journal started
Jun 05 14:53:45 m2 systemd-journald[219993]: System Journal (/var/log/journal/3f782b3abe994c79ab4e2449a839cc04) is 1.0G, max 997.9M, 0B free.

方法2

说明:该方法是直接查看目录是否存在,以及目录下是否有东西,不一定准确。

如下目录下有 system.journal 就代表日志放路径是该目录(不一定准确,因为你完全可以手动创建个该目录)

bash 复制代码
ls /var/log/journal/$(cat /etc/machine-id)
system.journal

2.ubuntu journal为啥使用的是 /run/log/journal 目录

在 Ubuntu(以及大多数使用 systemd 的 Linux 发行版)中,你看到的 /run/log/journal 目录其实代表着一种临时、内存中的日志存储机制

Ubuntu 之所以在这里存放日志,主要涉及 Linux 的系统架构设计、启动流程以及存储介质的寿命保护。以下是核心原因:

1. 临时存储(volatile)与持久化存储的区别

systemd-journald(负责管理系统日志的服务)有两种日志存储模式:

  • 内存模式(Volatile): 日志存放在 /run/log/journal

  • 持久化模式(Persistent): 日志存放在 /var/log/journal

/run 目录在现代 Linux 中是一个 tmpfs(内存文件系统)。这意味着存放在 /run/log/journal 中的日志全部保存在内存中,系统重启后就会消失

2. 为什么 Ubuntu 默认或在特定情况下使用它?

原因一:系统启动早期的"无盘"阶段

在 Linux 刚刚连上电源、内核刚加载的启动早期,硬盘的根目录 / 往往处于只读状态,或者硬盘根本还没有挂载成功。

  • 此时系统已经开始产生大量的启动日志。

  • 因为硬盘不可写,journald 只能把日志先写到初始化阶段就能使用的内存目录------也就是 /run/log/journal 中。

  • 当后面硬盘成功挂载且变成"可读写"后,journald 才会把日志从内存"刷新"(flush)到硬盘的 /var/log/journal 中。

原因二:保护嵌入式设备或闪存寿命

如果你的 Ubuntu 运行在树莓派、SD 卡、或某些固态硬盘(SSD)上,频繁的日志写入会急剧消耗闪存的擦写寿命(TBW)。

  • 默认将日志放在内存的 /run 中,可以大幅减少对硬盘的写操作。

原因三:Ubuntu 的配置策略(Storage=auto

/etc/systemd/journald.conf 配置文件中,有一个关键参数叫 Storage,它的默认值通常是 auto

Storage=auto 的逻辑是:

如果系统发现存在 /var/log/journal 这个目录,它就会把日志持久化到硬盘上;如果不存在 这个目录,它就乖乖地把日志留在内存的 /run/log/journal 中,重启即擦除。

💡 如何让日志永久保存到硬盘?

如果你发现你的 Ubuntu 每次重启后以前的日志就看不到了(因为它们在 /run 里),你可以通过以下两种方法将其改为持久化存储:

方法 A:手动创建持久化目录(最推荐,利用 auto 机制)

直接为它建个硬盘上的家,journald 发现后会自动切换:

bash 复制代码
# 1. 确保物理目录存在且权限正确(非常重要)
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal

# 2. 重启服务加载新配置
sudo systemctl restart systemd-journald

# 3. 核心命令:强制将内存日志刷入硬盘
sudo journalctl --flush

方法 B:修改配置文件

  1. 打开配置文件:

    Bash

    复制代码
    sudo nano /etc/systemd/journald.conf
  2. 找到 #Storage=auto,取消注释并改为 persistent

    复制代码
    Storage=persistent
  3. 保存退出后,重启日志服务:

    复制代码
    sudo systemctl restart systemd-journald

修改为持久化后,你就会发现日志文件转移到了 /var/log/journal/ 目录中,重启系统后历史日志也不会丢失了。

3.sudo systemd-tmpfiles --create --prefix /var/log/journal 作用

这条命令的核心作用是:按照系统预设的规则,为 /var/log/journal 目录安全地初始化权限、属主和 ACL(访问控制列表)。

简单来说,它不是一个简单的 mkdir,而是为了满足 systemd-journald 服务严苛的安全需求,给这个目录打上正确的"防伪标签"和"通行证"

具体拆解如下:

1. 为什么不能直接用 mkdir

systemd-journald 作为一个底层核心服务,为了防止日志被恶意篡改或越权读取,对 /var/log/journal 目录的权限要求极其苛刻。

如果你只用 sudo mkdir /var/log/journal,创建出来的目录默认属主是 root:root,权限通常是 755

  • 后果: journald 服务(通常以特定系统用户权限运行)会因为权限不足而拒绝写入,导致持久化失败,日志继续缩回内存。

2. 这个命令具体做了什么?

当你运行 sudo systemd-tmpfiles --create --prefix /var/log/journal 时,系统会去读取预设的配置文件(通常在 /usr/lib/tmpfiles.d/systemd.conf 中)。

它会针对 /var/log/journal 强行执行以下特殊操作:

  • 设置正确的属主与属组: 将目录交还给 root:systemd-journal

  • 设置特殊的权限位(SGID): 赋予 2755 (即 drwxr-sr-x) 权限。这个 s 代表 SGID 位,意味着未来在这个目录下创建的任何新日志文件,都会自动继承 systemd-journal 属组,确保日志服务永远有权读写。

  • 配置 ACL(访问控制列表): 赋予特定的系统组(如 admwheel)免密读取日志的权限,这样普通管理员不用切换到 root 也能通过 journalctl 看日志。

3. 参数详细拆解

  • systemd-tmpfiles:这是 systemd 自带的通用工具,专门用来管理(创建、清理、删除)系统中的临时文件和目录。

  • --create:字面意思,告知工具"请根据配置文件,创建缺失的目录,或者修正已存在目录的权限"。

  • --prefix /var/log/journal这是一个安全限制参数 。意思是"只处理路径以 /var/log/journal 开头的规则",防止系统去扫描和重建其他无关的临时目录,提高执行效率。

总结

在修改日志持久化时,这一步是承上启下 的关键。它建好了完美的"容器",并贴上了 systemd 认可的权限标签。

现在你运行 ls -ld /var/log/journal,应该能看到类似下面的输出:

Plaintext

复制代码
drwxr-sr-x+ 3 root systemd-journal 4096 Jun  5 01:40 /var/log/journal

那个 s+ 号,就是这条命令为你注入的"灵魂",有了它们,journald 才会放心地把日志从内存刷到硬盘里。

相关推荐
蜀道山老天师2 小时前
Docker 实战教程:从基础流程到云桌面、Zabbix 监控、Portainer 可视化部署
运维·docker·云原生·容器·zabbix
i写作业2 小时前
Lumerical MCP Server (v241) 配置与排障总结
服务器
-FxYaM-2 小时前
【UE】渲染框架学习路径-初次修改源码
服务器·网络·c++·windows·ue5·unreal engine
Better Bench2 小时前
Ubuntu 22.04系统中解决运行CC-Switch-v3.16.1-Linux-x86_64.AppImage中文乱码
linux·ubuntu·claude·claude code·cc-switch
skywalk81632 小时前
nginx的配置软件Nginx UI
运维·nginx·ui
A_humble_scholar2 小时前
Linux (一)入门指南:历史、常用指令、权限与文件属性详解
linux·运维·服务器
skywalk81632 小时前
在Ubuntu安装言律并部署playground web网页
linux·运维·ubuntu
zzqssliu2 小时前
Taocarts库存锁定机制优化:彻底解决跨境代购商品超卖问题
java·linux·javascript·php
yyuuuzz2 小时前
独立站搭建的几个核心技术问题
运维·服务器·网络·数据库·aws