Akemi

Linux日志管理systemd-journald

2026/03/04

journald是rsyslog的现代化替代方案,也不是说完全替代,这两个都用

  • 结构化二进制日志
    临时存放在/var/log/journal中,减少磁盘占用并提高读写效率
  • 多来源日志收集
    自动收集:
    内核日志
    用户空间进程的标准输出/错误
    systemd Unit的日志
    syslog协议的日志
    硬件相关事件
  • 日志查询工具journalctl
    按时间范围查询
    按Unit查询
    按PID查询、日志优先级查询
    实时跟踪日志
  • 日志持久化与轮转
    默认systemd-journald持久化需要手动创建/var/log/journal、并修改配置文件/etc/systemd/journald.conf
  • 安全性控制
    日志文件仅允许root和systemd-journal组用户读取
    支持日志签名和校验

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# /etc/systemd/journald.conf 重要参数

[Journal]
# 存储位置
Storage=persistent # 或 volatile(仅内存), auto(自动检测), none(禁用)

# 日志轮转和清理
Compress=yes # 压缩旧日志
Seal=yes # 密封日志(FSS验证)
SplitMode=uid # 按用户分割日志

# 空间限制
SystemMaxUse=10% # 最大使用磁盘百分比
SystemKeepFree=15% # 保持空闲空间百分比
SystemMaxFileSize=100M # 单个文件最大大小
RuntimeMaxUse=10% # 运行时(内存)最大使用

# 时间限制
MaxRetentionSec=1month # 最大保留时间
MaxFileSec=1month # 单个文件保留时间

# 文件数量限制
SystemMaxFiles=100 # 最大文件数量

journalctl命令用法参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
journalctl -f
# 从末尾开始查看(最新日志在前)
journalctl -e
# 倒序查看(最新日志在前)
journalctl -r
# 查看完整内容(不截断)
journalctl --full
# 显示行号
journalctl --line-prefix

# 只看最新N行
journalctl -n 20 # 最后20行
# 最旧20行
journalctl --reverse -n 20

# 设置分页器
journalctl --no-pager # 不分页,直接输出
journalctl --pager-end # 从末尾开始分页

# 最近时间
journalctl --since "1 hour ago"
journalctl --since "2 days ago"
journalctl --since "5 minutes ago"

# 时间范围
journalctl --since "10:00" --until "11:00"
journalctl --since "09:00" --until "now"

# 今天/昨天
journalctl --since today
journalctl --since yesterday --until today

# 本周
journalctl --since "this week"
journalctl --since "monday" --until "friday"

# 绝对时间
# 标准格式
journalctl --since "2024-01-01 00:00:00"
journalctl --since "2024-01-01" --until "2024-01-02"

# ISO 8601格式
journalctl --since "2024-01-01T00:00:00"
journalctl --since "2024-01-01T00:00:00Z" # UTC
journalctl --since "2024-01-01T00:00:00+08:00" # 时区

# 简写
journalctl --since "yesterday 14:30"
journalctl --since "2024-01-01 14:30:00" --until "2024-01-01 15:30:00"

# 启动周期相关查看
# 查看当前启动的日志
journalctl -b

# 查看指定启动次数的日志
journalctl -b 0 # 当前启动(默认)
journalctl -b -1 # 上一次启动
journalctl -b -2 # 上上次启动
journalctl -b 2 # 启动ID为2的启动

# 查看所有启动列表
journalctl --list-boots

# 输出示例:
# -2 5a70e8c7... Mon 2024-01-01 08:00:00 CST—Mon 2024-01-01 18:00:00 CST
# -1 8b3f1d2e... Mon 2024-01-01 19:00:00 CST—Tue 2024-01-02 08:00:00 CST
# 0 e4c5a9f1... Tue 2024-01-02 08:30:00 CST—(现在)

# 结合时间查看
journalctl -b -1 --since "2024-01-01 10:00"

# 数字等级(0-7)
journalctl -p 0 # emerg(紧急)
journalctl -p 1 # alert(警报)
journalctl -p 2 # crit(严重)
journalctl -p 3 # err(错误)
journalctl -p 4 # warning(警告)
journalctl -p 5 # notice(注意)
journalctl -p 6 # info(信息)
journalctl -p 7 # debug(调试)

# 按单元名称
journalctl -u nginx.service
journalctl -u sshd.service
journalctl -u docker.service

# 多个单元
journalctl -u nginx.service -u php-fpm.service
journalctl -u "nginx*" # 通配符

# 单元和优先级结合
journalctl -u nginx.service -p err
journalctl -u nginx.service --since "1 hour ago"

# 查看单元状态变化
journalctl -u nginx.service _SYSTEMD_UNIT_STATE=active
journalctl -u nginx.service _SYSTEMD_UNIT_STATE=failed

# 输出格式
# 短格式(默认)
journalctl -o short
# 详细格式(显示所有字段)
journalctl -o verbose
# 导出格式(适合备份)
journalctl -o export

CATALOG