systemd-journald 使用与配置指南

一、概述

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 按时间筛选

相对时间

bash 复制代码
journalctl --since "1 hour ago"      # 最近1小时
journalctl --since "yesterday"       # 昨天至今
journalctl --since "6 months ago"    # 近6个月
journalctl --until "6 months ago"    # 6个月之前的旧日志

绝对时间

bash 复制代码
journalctl --since "2026-07-01"                          # 7月1日至今
journalctl --since "2026-07-08 20:00" --until "2026-07-09 08:00"  # 指定区间

时间区间组合

bash 复制代码
# 6个月前 ~ 3个月前 的日志
journalctl --since "6 months ago" --until "3 months ago"

2.3 按日志来源筛选

按 systemd 服务(最常用)

bash 复制代码
journalctl -u nginx                # 查看 nginx 服务日志
journalctl -u docker -u kubelet    # 同时看多个服务
journalctl -u sshd -f              # 实时跟踪 sshd 登录日志

按进程 PID / 可执行文件

bash 复制代码
journalctl _PID=1234               # 指定进程号
journalctl _EXE=/usr/sbin/sshd     # 指定可执行文件路径

按用户 / 组

bash 复制代码
journalctl _UID=0                  # root 用户产生的日志
journalctl _GID=1000               # 指定组

内核日志(等价 dmesg)

bash 复制代码
journalctl -k                      # 本次开机内核日志
journalctl -k -b -1                # 上次开机内核日志

⚠️ 注意-k 才能查内核日志,-u kernel 无效(kernel 不是 systemd 服务单元)

审计日志(audit)

bash 复制代码
journalctl _TRANSPORT=audit        # auditd 转发的审计事件
journalctl -g "iptables-restor"    # 按关键词匹配(grep 方式)

按日志优先级

bash 复制代码
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 手动清理日志

bash 复制代码
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/ 发行版默认配置

查看完整生效配置

bash 复制代码
systemd-analyze cat-config systemd/journald.conf

3.2 核心参数(Journal 段)

存储策略

参数 默认值 说明
Storage=persistent auto persistent=存磁盘 /var/log/journalvolatile=仅内存 /run/log/journalauto=有目录则持久化
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个月留存标准)

bash 复制代码
# 创建分片配置
mkdir -p /etc/systemd/journald.conf.d

文件:/etc/systemd/journald.conf.d/99-retention.conf

ini 复制代码
[Journal]
Storage=persistent
Compress=yes

# 容量上限
SystemMaxUse=8G
SystemKeepFree=500M
SystemMaxFileSize=500M

# 时间留存(6个月审计标准)
MaxRetentionSec=6month
MaxFileSec=1month

# 内存日志限制
RuntimeMaxUse=200M

# 关闭终端广播
ForwardToWall=no

生效:

bash 复制代码
systemctl restart systemd-journald

# 校验分片配置被systemd正常读取 
systemd-analyze cat-config systemd/journald.conf

journalctl --disk-usage

3.4 自动清理触发逻辑(优先级从高到低)

  1. SystemKeepFree:磁盘剩余不足 → 立刻删最旧日志
  2. SystemMaxUse:总大小超限 → 删除最旧归档
  3. MaxRetentionSec:超过保留期限 → 删除过期日志
  4. 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: 日志占满磁盘?

bash 复制代码
journalctl --disk-usage          # 查看占用
journalctl --vacuum-size=1G      # 紧急清理
# 永久限制:配置 SystemMaxUse / SystemKeepFree

Q4: 如何保证6个月审计留存?

  • 必须设 MaxRetentionSec=6month
  • 同时 SystemMaxUse 留足空间,避免空间不足提前删旧日志
  • 建议集中日志服务器远端备份,防止本地磁盘故障丢失
相关推荐
神奇小汤圆1 小时前
30分钟实现自己的AI聊天机器人(SpringBoot接入DeepSeek API)
后端
再吃一根胡萝卜1 小时前
从最左前缀到地址索引:我对 MySQL 索引的一次完整复盘
后端
郡杰1 小时前
Spring Boot 请求流转与 RESTful
后端
再吃一根胡萝卜2 小时前
Redis 都有哪些用处?都会用在什么地方?
后端
再吃一根胡萝卜2 小时前
分布式与分布式锁:从访问量到数据一致性
后端
再吃一根胡萝卜2 小时前
分库分表:为什么我不建议一上来就分表
后端
再吃一根胡萝卜2 小时前
MySQL 慢查询优化:从定位到根治的完整思路
后端
Nturmoils3 小时前
订单查询丢数据,查了半天原来是 WHERE 惹的祸
数据库·后端
叫我Paul就好3 小时前
自从用上 Agents View 之后, 我的心力交瘁感消失了
后端