Home journalctl - systemd辅助日志工具
Post
Cancel

journalctl - systemd辅助日志工具

系统日志一般位于 /var/log/ 目录。主要日志文件syslog或messages。查看日志文件可以使用通用的文本查看工具或文本编辑器。 而使用systemd 作为init程序的系统上,systemd会统一管理所有units的日志,并额外提供了一个journalctl工具来查看、过滤 units的日志。journalctl是systemd的日志管理的一部分,systemd中有一个systemd-journald.service服务,由它来为systemd 记录日志到系统日志文件中,journalctl就可以用来查看由该服务记录的日志。相关的手册可以参考如下。

1
2
3
$ man 1 journalctl
$ man 8 systemd-journald.service
$ man 5 journald.conf

目前主流发行版都使用systemd作为init进程,很多服务也移植为systemd服务了。journalctl有很广的使用空间,这里记录一些使用方式。

journalctl 基本使用

1
journalctl [OPTIONS...] [MATCHES...]

详细细节参考 journalctl man 手册 ,man 1 journalctl

输出所有的日志记录

不带任何参数,直接运行journalctl,会显示本次启动后,由systemd-journald.service服务记录的日志。使用方法同less。 有一些高亮提示。

1
$ journalctl

日志文件的磁盘空间管理

1
2
3
4
5
6
7
8
# 查看系统日志文件的磁盘占用大小情况
$ sudo journalctl --disk-usage

# 指定日志文件占据的最大空间
$ sudo journalctl --vacuum-size=1G

# 指定日志文件保存多久
$ sudo journalctl --vacuum-time=1years

另外, 可以通过 /etc/systemd/journald.conf 文件来配置 systemd-journald服务的磁盘使用限制等,具体参考man手册。

指定时间范围

参数选项 -S, --since=, -U, --until=,指定from S to U。

1
2
3
4
5
$ sudo journalctl --since="2012-10-30 18:17:16"
$ sudo journalctl --since "20 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2015-01-10" --until "2015-01-11 03:00"
$ sudo journalctl --since 09:00 --until "1 hour ago"

指定服务名或程序

以ssh服务为例,可以指定服务名,或程序名。使用 -u, --unit=UNIT|PATTERN 指定服务名,支持通配符。 也可以直接匹配一个可执行程序。-u 参数可以使用多次,指定多个,即一个或关系。

1
2
$ sudo journalctl -u ssh.service
$ sudo journalctl /usr/sbin/sshd

指定最新几行

这个用法类似 tail -n 。

1
2
# 显示尾部最后20行日志
$ sudo journalctl -n 20

使用标准输出模式

默认journalctl使用的是按页输出的,即less工具的形式。指定 --no-pager参数使用标准输出。

1
$ journalctl --no-pager

阻塞输出模式

这个用法类似 tail -f 。可以wait on 等待日志输出,最好继续配合其他选项进行过滤,如服务名。

1
$ sudo journalctl -f

输出内核日志

不显示应用层日志,仅显示内核层日志。

1
$ sudo journalctl -k

查看设备相关的内核日志

可以查看设备节点的相关内核日志,如

1
2
3
$ sudo journalctl /dev/sda
$ sudo journalctl /dev/nvme0n1  
$ sudo journalctl /dev/sda

输出过去某次运行日志

可以简单认为一次从开机到关机的所有日志。

1
2
3
4
5
6
7
8
9
# 本次开机启动为止的日志
$ journalctl -b
$ journalctl -b -0

# 上次开机的日志==1,上上次就是2,类推
$ journalctl -b -1

# 配合-k使用,查看上次运行的内核日志
$ sudo journalctl -k -b -1

上次,或上几次的日志是保存在系统日志中的,保存的数量可以配置,可以使用命令查看系统保存的次数。

1
2
3
4
5
6
7
8
$ journalctl --list-boots
Hint: You are currently not seeing messages from other users and the system.
      Users in groups 'adm', 'systemd-journal' can see all messages.
      Pass -q to turn off this notice.
-3 dfd9de3a32b04e6da9af979a1c1b1b1f Thu 2023-02-16 17:34:39 CST—Fri 2023-02-24 16:08:30 CST
-2 6d74af3182824f989b43d1d75f442e6a Fri 2023-02-24 17:19:06 CST—Thu 2023-03-02 13:44:31 CST
-1 ed4ef5306cc3412b99f18b6ff25dc840 Thu 2023-03-02 14:24:04 CST—Fri 2023-03-17 12:48:54 CST
 0 00738d71a4aa484a88831c64cb5b8e13 Fri 2023-03-17 13:03:19 CST—Wed 2023-03-22 10:43:50 CST

通过日志级别进行过滤

使用 -p 选项来过滤日志的级别。 可以指定的优先级如下:

  • 0: emerg
  • 1: alert
  • 2: crit
  • 3: err
  • 4: warning
  • 5: notice
  • 6: info
  • 7: debug
1
2
# 注意,这里指定的是优先级的名称。
$ sudo journalctl -p err

日志的持久化存储

参考 man journald.confStorage= 字段。

This post is licensed under CC BY 4.0 by the author.

Shell 中使用关联数组(Map)

Shell - Bash个性化