journalctl查看systemd日志

背景

最近发现系统挂起后,再次唤醒会黑屏,
并且此时无法使用ssh连接,看起来不是单纯的无法显示问题.
因此需要查看系统启动的日志,
journalctl就是这样的一个工具.

Systemd的日志

启动过程和服务管理的大部分由 Systemd 来管理,
为了日志管理的方便, Systemd 将内核日志和用户日志集中管理, 对收集和访问方式进行了标准化.
用来收集和管理这些日志的系统叫 journal.
该系统由守护进程 journald 启动和维护.
该系统的结果可以使用 journalctl 工具来查看.
另外这些日志是以二进制的形式保存的,
好处之一是可以随意选择是使用本地时间还是UTC时间显示.
日志内容包括但不限于

  • 引导过程
  • 内核
  • initrd
  • 程序的标准错误
  • 退出日志

配置文件放在 /etc/systemd/journald.conf

基础使用

1
2
3
4
5
# 最基础,时间从早到晚
journalctl

# 使用UTC时间
journalctl --utc

过滤

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
###
# 模拟tail
###
journalctl -n 10
journalctl -f


###
# 按启动过滤
###
# 单纯查看启动的时间和次数等
# 将获得一系列的序号,0表示最近,-1表示上次,-2表示上上次...
journalctl --list-boots

# 显示最近一次开机之后的日志
journalctl -b

# 显示指定一次开机后的日志
# list-boots得到的序号后是启动id,也可以使用启动id来指定
journalctl -b -1


###
# 按时间过滤
###
# 指定完整的时间戳
journalctl --since "2020-03-01 00:00:00"

# 时间戳可省略
journalctl --since "2020-03-01" --until "2020-03-02 03:00"
journalctl --since "09:00"

# 指定名词
journalctl --since yesterday
journalctl --since "09:00" --until "1 hour ago"


###
# 按程序过滤
# 日志格式: 时间 host 信息(程序 日志)
###
journalctl -u nginx.service -u php-fpm.service
journalctl /usr/bin/bash # 可惜不是所有的进程都有可执行文件

# 如果单纯像看kernal信息可以使用
journalctl -k
journalctl --dmesg


###
# 按进程,用户id,组id
###
journalctl _PID=8088
journalctl _UID=33 # 用户id可以使用 id -u www-data等来查看
journalctl _GUI=87 # 组id可以使用 journalctl -F _GID等来查看


###
# 按优先级
# 可选的优先级从高到低依次有
# - emerg
# - alert
# - crit
# - err
# - warning
# - notice
# - info
# - debug
###
# 指定只显示高于此优先级的
journalctl -p err

格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 消息太长的省略
journalctl --no-full

# 显示最长最丰富的消息
journalctl -a

# 直接输出到std out
# 之后可以使用管道命令处理了
journalctl --no-pager

# 以json格式输出
# 通常加以限定防止文件过大?
# 一行的json
journalctl -b -u nginx -o json
# 有换行的json
journalctl -b -u nginx -o json-pretty

可以使用的格式有

  • cat 消息字段本身
  • export 用于传输的二进制格式
  • json
  • json-pretty
  • json-sse
  • short (默认值,等同于syslog格式)
  • short-iso (ISO 8601时间戳格式)
  • short-monotonic 单调时间戳?
  • short-precise 精度为微秒的时间戳
  • verbose 显示所有

管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看磁盘占用
journalctl --disk-usage

###
# 删除旧日志
# 删除时需要权限
# 从删除记录来看日志存放在 /var/log/journal/下,常见8M到72M不等的文件
###

# 限定占用大小的方式,旧的会被删除
sudo journalctl --vacuum-size=1G

# 限定保留的时长
sudo journalctl --vacuum-time=3months

此外也可以在配置文件中指定各种限制大小

  • SystemMaxUse 在非易失性磁盘上,日志全体的最大占用
  • SystemKeepFree 剩余空间应该保证多大
  • SystemMaxFileSize 单个文件的大小,超过会压缩已经有的
  • RuntimeMaxUse 在 /run 路径下的情况,可能就是在内存中?
  • RuntimeKeepFree
  • RuntimeMaxFileSize

参考

  1. 难得的从背景开始的介绍