背景
最近发现系统挂起后,再次唤醒会黑屏,
并且此时无法使用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
参考
- 难得的从背景开始的介绍