journalctl — 检索 systemd 日志
journalctl 可用于检索 systemd(1) 日志(由 systemd-journald.service(8) 记录)。
如果不带任何参数直接调用此命令, 那么将显示所有日志内容(从最早一条日志记录开始)。
如果指定了 [MATCHES...] 参数, 那么输出的日志将会按照 [MATCHES...] 参数进行过滤。 MATCHE 必须符合 "FIELD=VALUE
" 格式 (例如 "_SYSTEMD_UNIT=httpd.service
" ), 参见 systemd.journal-fields(7) 手册以了解日志字段的详细介绍。 如果有多个不同的字段被 [MATCHES...] 参数匹配, 那么这些字段之间使用"AND"逻辑连接, 也就是,日志项必须同时满足全部字段的匹配条件才能被输出。 如果同一个字段被多个 [MATCHES...] 参数匹配, 那么这些匹配条件之间使用"OR"逻辑连接, 也就是对于同一个字段,日志项只需满足任意一个匹配条件即可输出。 最后, "+
" 字符可用作 [MATCHES...] 组之间的分隔符,并被视为使用"OR"逻辑连接。 也就是,MATCHE1 MATCHE2 + MATCHE3 MATCHE4 MATCHE5 + MATCHE6 MATCHE7 相当于 ( MATCHE1 MATCHE2 ) OR ( MATCHE3 MATCHE4 MATCHE5 ) OR ( MATCHE6 MATCHE7 )
还可以使用绝对路径作为参数来过滤日志。 绝对路径可以是普通文件,也可以是软连接, 但必须指向一个确实存在的文件。 如果路径指向了一个二进制可执行文件, 那么它实际上相当于是一个对 "_EXE=
" 字段的匹配(仅匹配完整的绝对路径)。 如果路径指向了一个可执行脚本, 那么它实际上相当于是一个对 "_COMM=
" 字段的匹配(仅匹配脚本的文件名)。 如果路径指向了一个设备节点, 那么它实际上相当于是一个对 "_KERNEL_DEVICE=
" 字段的匹配(匹配该设备及其所有父设备的内核设备名称)。 在查询时, 软连接会被追踪到底,内核设备名称将被合成, 父设备将按照当时的实际情况被提列出来。 因为日志项一般并不包含标记实际物理设备的字段, 所以,设备节点一般就是实际物理设备的最佳代表。 但是又因为设备节点与物理设备之间的对应关系在系统重启之后可能会发生变化, 所以,根据设备节点过滤日志仅对本次启动有意义, 除非你能确认对应关系在重启之后保持不变。
可以使用 --boot
, --unit=
等选项 进一步附加额外的约束条件(相当于使用"AND"逻辑连接)。
最终的输出结果来自所有可访问的日志文件的综合, 无论这些日志文件是否正在滚动或者正在被写入, 也无论这些日志文件是属于系统日志还是用户日志, 只要有访问权限,就会被包括进来。
用于提取日志的日志文件的集合可以使用 --user
, --system
, --directory
, --file
选项进行筛选。
每个用户都可以访问其专属的用户日志。 但是默认情况下, 只有root用户以及 "systemd-journal
", "adm
", "wheel
" 组中的用户才可以访问全部的日志(系统与其他用户)。 注意,一般发行版还会给 "adm
" 与 "wheel
" 组一些其他额外的特权。 例如 "wheel
" 组的用户一般都可以执行一些系统管理任务。
默认情况下,结果会通过 less 工具进行分页输出, 并且超长行会在屏幕边缘被截断。 不过,被截掉的部分可以通过左右箭头按键查看。 如果不想分页输出,那么可以使用 --no-pager
选项,参见下面的"环境变量"小节。
如果是输出到 tty 的话,行的颜色还会根据日志的级别变化: ERROR 或更高级别为红色,NOTICE 或更高级别为高亮,其他级别则正常显示。
常用命令
journalctl -xe
打印从2019-08-22 11:00:00后面的日志
journalctl --since "2019-08-22 11:00:00"