一、概述
systemd-journald 是 systemd 自带的日志管理服务,负责收集、存储、检索全系统日志,以二进制结构化格式 存储于 /var/log/journal/(持久化)或 /run/log/journal/(内存)。
配套查询工具:journalctl
二、journalctl 日志查询
2.1 基础查看
| 命令 |
作用 |
journalctl |
查看全部日志(默认分页) |
journalctl --no-pager |
不分页直接输出全部 |
journalctl -f |
实时跟踪最新日志(类似 tail -f) |
journalctl -n 50 |
只看最后 50 行 |
journalctl -b |
查看本次开机以来的日志 |
journalctl -b -1 |
查看上一次开机的日志 |
journalctl --disk-usage |
查看 journal 占用磁盘大小 |
2.2 按时间筛选
相对时间
journalctl --since "1 hour ago" # 最近1小时
journalctl --since "yesterday" # 昨天至今
journalctl --since "6 months ago" # 近6个月
journalctl --until "6 months ago" # 6个月之前的旧日志
绝对时间
journalctl --since "2026-07-01" # 7月1日至今
journalctl --since "2026-07-08 20:00" --until "2026-07-09 08:00" # 指定区间
时间区间组合
# 6个月前 ~ 3个月前 的日志
journalctl --since "6 months ago" --until "3 months ago"
2.3 按日志来源筛选
按 systemd 服务(最常用)
journalctl -u nginx # 查看 nginx 服务日志
journalctl -u docker -u kubelet # 同时看多个服务
journalctl -u sshd -f # 实时跟踪 sshd 登录日志
按进程 PID / 可执行文件
journalctl _PID=1234 # 指定进程号
journalctl _EXE=/usr/sbin/sshd # 指定可执行文件路径
按用户 / 组
journalctl _UID=0 # root 用户产生的日志
journalctl _GID=1000 # 指定组
内核日志(等价 dmesg)
journalctl -k # 本次开机内核日志
journalctl -k -b -1 # 上次开机内核日志
⚠️ 注意 :-k 才能查内核日志,-u kernel 无效(kernel 不是 systemd 服务单元)
审计日志(audit)
journalctl _TRANSPORT=audit # auditd 转发的审计事件
journalctl -g "iptables-restor" # 按关键词匹配(grep 方式)
按日志优先级
journalctl -p err # 只看 error 及以上级别
journalctl -p warning # warning 及以上
级别(从高到低):emerg > alert > crit > err > warning > notice > info > debug
2.4 输出格式
| 参数 |
格式 |
-o short |
默认简短格式 |
-o short-full |
完整时间戳 |
-o verbose |
全部结构化字段(排查字段名用) |
-o json |
JSON 格式 |
-o export |
可重新导入的二进制导出格式 |
2.5 手动清理日志
journalctl --vacuum-time=7d # 只保留最近7天
journalctl --vacuum-size=500M # 总大小压缩到 500M 以内
journalctl --vacuum-files=8 # 只保留 8 个归档文件
journalctl --rotate --vacuum-time=6month # 先轮转再清理
三、配置文件
3.1 配置文件层级
| 文件/目录 |
作用 |
/etc/systemd/journald.conf |
主配置文件(不建议直接改,升级可能覆盖) |
/etc/systemd/journald.conf.d/*.conf |
drop-in 分片配置(推荐方式,优先级高) |
/usr/lib/systemd/journald.conf.d/ |
发行版默认配置 |
查看完整生效配置:
systemd-analyze cat-config systemd/journald.conf
3.2 核心参数(Journal 段)
存储策略
| 参数 |
默认值 |
说明 |
Storage=persistent |
auto |
persistent=存磁盘 /var/log/journal;volatile=仅内存 /run/log/journal;auto=有目录则持久化 |
Compress=yes |
yes |
归档日志自动 gzip 压缩 |
磁盘容量限制(持久化日志)
| 参数 |
说明 |
SystemMaxUse=1G |
journal 总磁盘占用上限 |
SystemKeepFree=500M |
磁盘必须预留的空闲空间(优先级最高) |
SystemMaxFileSize=100M |
单个 journal 文件最大大小 |
SystemMaxFiles=100 |
最多保留归档文件数量 |
内存日志限制
| 参数 |
说明 |
RuntimeMaxUse=200M |
内存中 journal 最大占用 |
RuntimeMaxFileSize / RuntimeMaxFiles |
内存日志单文件/文件数限制 |
时间留存策略
| 参数 |
默认值 |
说明 |
MaxRetentionSec=6month |
空 |
日志最长保留时间,超期自动删除 |
MaxFileSec=1month |
1month |
单个日志文件最长跨度,到期自动轮转新文件 |
日志转发
| 参数 |
说明 |
ForwardToSyslog=no |
是否转发给 rsyslog 生成文本日志 |
ForwardToWall=no |
紧急日志是否广播到所有终端 |
3.3 生产配置示例(6个月留存标准)
# 创建分片配置
mkdir -p /etc/systemd/journald.conf.d
文件:/etc/systemd/journald.conf.d/99-retention.conf
[Journal]
Storage=persistent
Compress=yes
# 容量上限
SystemMaxUse=8G
SystemKeepFree=500M
SystemMaxFileSize=500M
# 时间留存(6个月审计标准)
MaxRetentionSec=6month
MaxFileSec=1month
# 内存日志限制
RuntimeMaxUse=200M
# 关闭终端广播
ForwardToWall=no
生效:
systemctl restart systemd-journald
# 校验分片配置被systemd正常读取
systemd-analyze cat-config systemd/journald.conf
journalctl --disk-usage
3.4 自动清理触发逻辑(优先级从高到低)
- SystemKeepFree:磁盘剩余不足 → 立刻删最旧日志
- SystemMaxUse:总大小超限 → 删除最旧归档
- MaxRetentionSec:超过保留期限 → 删除过期日志
- SystemMaxFiles:文件数超限 → 删除最旧文件
四、journald 与 logrotate 的区别
| 对比项 |
systemd-journald |
logrotate |
| 管理对象 |
/var/log/journal/ 二进制结构化日志 |
/var/log/*.log 纯文本日志 |
| 驱动方式 |
systemd 常驻服务,实时写入与清理 |
cron 定时任务,通常每天执行一次 |
| 存储格式 |
二进制数据库,需 journalctl 读取 |
纯文本,cat/vim 直接打开 |
| 清理粒度 |
单条日志记录精准过期 |
整个日志文件批量删除 |
| 时间留存 |
原生支持 MaxRetentionSec,精确到秒 |
仅控制归档文件份数,无全局过期时间 |
| 压缩机制 |
内置自动压缩归档文件 |
需手动开启 compress 选项 |
| 轮转方式 |
按大小/时间自动生成新 journal 文件 |
重命名旧文件 + create 新空文件 |
| 配置方式 |
journald.conf + drop-in |
logrotate.conf + /etc/logrotate.d/* |
| 典型场景 |
内核、systemd 服务、审计、SSH 登录等系统日志 |
Nginx、MySQL、应用输出等文本日志 |
配合关系
- 二者互不干扰、各司其职,同时存在。
- journald 二进制日志自带清理,不要用 logrotate 处理
/var/log/journal,会损坏索引。
- 若开启
ForwardToSyslog=yes,rsyslog 落地的文本日志(/var/log/messages 等)由 logrotate 管理。
五、常见问题排查
Q1: journalctl -u xxx 查不到日志?
- 确认服务名正确:
systemctl list-units | grep xxx
- 内核日志用
-k,不用 -u
- audit 审计日志用
_TRANSPORT=audit 或 -g audit:
Q2: 重启后日志丢失?
- 检查
Storage=persistent 是否已设
- 检查
/var/log/journal/ 目录是否存在:mkdir -p /var/log/journal && systemctl restart systemd-journald
Q3: 日志占满磁盘?
journalctl --disk-usage # 查看占用
journalctl --vacuum-size=1G # 紧急清理
# 永久限制:配置 SystemMaxUse / SystemKeepFree
Q4: 如何保证6个月审计留存?
- 必须设
MaxRetentionSec=6month
- 同时
SystemMaxUse 留足空间,避免空间不足提前删旧日志
- 建议集中日志服务器远端备份,防止本地磁盘故障丢失