journal 是 systemd 的日志系统,全称是 systemd-journald。它负责收集、存储和管理 Linux 系统中所有服务和内核的日志。
简单来说:所有 systemd 管理的服务输出的信息(stdout/stderr)都会被 journal 统一管理。
journal 的特点
集中管理日志
不同服务的日志统一存储,不用自己去找 /var/log/*.log 文件。
结构化日志
除了普通文本,还保存了时间戳、服务名、PID、用户、优先级等信息,方便查询和过滤。
实时查看
可以通过 journalctl -u 服务名 -f 实时跟踪服务输出(类似 tail -f)。
持久化/临时
默认日志存储在内存中(重启丢失),可以配置 /etc/systemd/journald.conf 让日志写入磁盘。
systemd service 与 journal
在 .service 文件里:
StandardOutput=journal
StandardError=journal
表示服务的 stdout 和 stderr 输出都会发送到 journal。
这样不用单独创建日志文件,也能统一管理。
常用命令
# 查看某个服务日志
journalctl -u fastapi
# 实时跟踪日志
journalctl -u fastapi -f
# 查看最近 100 条日志
journalctl -u fastapi -n 100
# 查看某个时间段日志
journalctl -u fastapi –since “2025-11-26 12:00” –until “2025-11-26 14:00”
-u 指定 unit(服务名),-f 实时跟踪,–since/–until 时间过滤
总结
journal = systemd 日志管理系统
优点:集中、结构化、可过滤、实时
配合 .service 文件中的 StandardOutput=journal,可以轻松管理服务日志
日志优化
默认情况下 systemd-journald 会保存在 /run/log/journal(内存)或 /var/log/journal(持久化)里。
systemd 提供了 日志大小控制和轮转机制。
日志存储位置
临时存储(默认)
/run/log/journal → 重启后丢失
持久化存储
/var/log/journal → 重启后仍保存
需要目录存在:
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles –create –prefix /var/log/journal
sudo systemctl restart systemd-journald
systemd-journald 的二进制日志文件,不是普通文本文件,所以直接 cat 或 less 是不可读的。
为什么是二进制文件?
systemd 采用 二进制格式 存储日志,保存了结构化信息:
- 时间戳
- 日志来源(unit、PID、UID 等)
- 日志级别
- 标准输出 / 错误
优点:
- 查询和过滤更快
- 占用空间比纯文本日志更小
- 可以存储更多元信息
缺点:
- 不能直接用 cat 或 less 查看
- 必须用 journalctl 工具读取
控制日志大小
编辑 /etc/systemd/journald.conf,常用选项:
| 配置 | 含义 | 建议 |
|---|---|---|
SystemMaxUse= |
日志最大磁盘空间 | 500M 或 1G |
SystemKeepFree= |
系统盘保留空间 | 100M |
SystemMaxFileSize= |
单个 journal 文件最大大小 | 50M |
SystemMaxFiles= |
最大 journal 文件数量 | 10 |
MaxRetentionSec= |
日志最大保留时间 | 1month |
修改后执行:
sudo systemctl restart systemd-journald
查看和清理日志
实时查看:
journalctl -u fastapi -f
按大小清理:
# 清理旧日志,使总大小 ≤ 500M
sudo journalctl –vacuum-size=500M
按时间清理:
# 删除超过 30 天的日志
sudo journalctl –vacuum-time=30d
小结
写入 journal 会占用磁盘空间,但可以通过 journald.conf 控制大小和轮转
对生产环境,建议:
设置合理的 SystemMaxUse 和 SystemMaxFileSize
配合 journalctl –vacuum-* 定期清理
高负载或大日志量服务,也可以额外输出到文件并轮转(logrotate)