Linux systemd-journald 服务说明

systemd-journald 服务简介

systemd-journald 服务是 systemd init 系统提供的收集系统日志的服务。它会根据从内核、用户进程、标准输入和系统服务错误收到的日志记录信息,维护结构化的索引日记,并以此方式来收集和储存日志记录数据。systemd-journald 服务默认处于启用状态。

默认情况下,systemd-journald/run/log/journal/ 中储存日志数据。由于 /run/ 目录具有易失本性,因此,在重引导时会丢失日志数据。要永久保存日志数据,/var/log/journal/ 目录必须存在且具有正确的所有权和权限,如此,systemd-journald 服务便可在其中储存其数据。

要在终端中查看日志信息,可以使用命令 journalctl

systemd-journald 服务常用配置

持久化日志存储

默认情况下,日志位于 /run/log/journal/,重启后日志会丢失,为了持久化日志,可按照以下 2 种方法之一配置

  • 方法 1

    1. root 身份打开 /etc/systemd/journald.conf 进行编辑
      vi /etc/systemd/journald.conf
    2. 将包含 Storage= 的行取消注释,并将它更改为 Storage=persistent
      /etc/systemd/journald.conf
      [Journal]
      Storage=persistent
      #Compress=yes
      SystemMaxUse=50M
      [...]
    3. 重启 systemd-journald
      systemctl restart systemd-journald
      之后日志会持久化存储于 /var/log/journal。这些数据最多会占用 /var/log/journal 所在文件系统空间的 10%,要更改此限制,可以修改选项 SystemMaxUse=50M
  • 方法 2
    1. 创建目录 /var/log/journal
    2. 重启日志服务
      systemd-journald.service

journalctl 命令查看日志

不带任何选项时,journalctl 输出所有的日志。

$ journalctl 
-- Logs begin at Thu 2022-11-17 12:09:10 CST, end at Mon 2022-11-21 14:53:36 CST. --
Nov 17 12:09:10 localhost systemd-journal[156]: Runtime journal is using 8.0M (max allowed 380.5M, trying to leave 570
Nov 17 12:09:10 localhost kernel: Linux version 5.4.217-1.el7.elrepo.x86_64 (mockbuild@Build64R7) (gcc version 9.3.1 2
Nov 17 12:09:10 localhost kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-5.4.217-1.el7.elrepo.x86_64 root=UUID=44a6a61
Nov 17 12:09:10 localhost kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
Nov 17 12:09:10 localhost kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
Nov 17 12:09:10 localhost kernel: x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
Nov 17 12:09:10 localhost kernel: x86/fpu: Supporting XSAVE feature 0x008: 'MPX bounds registers'
Nov 17 12:09:10 localhost kernel: x86/fpu: Supporting XSAVE feature 0x010: 'MPX CSR'
Nov 17 12:09:10 localhost kernel: x86/fpu: Supporting XSAVE feature 0x020: 'AVX-512 opmask'
Nov 17 12:09:10 localhost kernel: x86/fpu: Supporting XSAVE feature 0x040: 'AVX-512 Hi256'
Nov 17 12:09:10 localhost kernel: x86/fpu: Supporting XSAVE feature 0x080: 'AVX-512 ZMM_Hi256'

日常使用中,需要配合各种匹配策略类匹配具体的日志。我们可以通过 FIELD=VALUE 的格式来匹配具体的日志记录,通过 man 7 systemd.journal-fields 可以查看所有可用的 match 字段

日志匹配

通过字段 _SYSTEMD_UNIT=cron.service 可以查看服务 cron.service 的日志,等同于选项 -u cron.service

journalctl -u crond
journalctl _SYSTEMD_UNIT=crond.service

可以同时添加多个字段进行匹配,它们之间是 的关系,就是同时符合多个条件的记录才会被匹配,比如添加 PRIORITY 字段的匹配条件:

journalctl _SYSTEMD_UNIT=crond.service PRIORITY=6

注意各个字段的取值,比如为 PRIORITY 设置 debuginfo 是不工作的,必须设置为对应的数字。可以通过 -F 选项来查看某个字段的可选值:

$ journalctl -F PRIORITY
3
2
4
5
6
7

对同一个字段使用多个字段匹配时,相当于 的关系,匹配的字段都会输出

journalctl _SYSTEMD_UNIT=cron.service _SYSTEMD_UNIT=prometheus.service

此时 cron.serviceprometheus.service 的日志都会输出。

使用 + 号可以对多个匹配字段执行 操作:

journalctl _SYSTEMD_UNIT=cron.service + _PID=28097

上面的命令会输出 cron.service 的日志和进程 28097 的日志。

下面是一个更复杂的例子:

journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=28097 + _SYSTEMD_UNIT=dbus.service

前面的两个条件是 的关系,最后一个条件与前面的两个条件是 的关系,也就是相当于用小括号把前面的两个条件括起来。

查看指定时间段的日志

利用 --since--until 选项设定时间段,二者分别负责指定给定时间之后与之前的日志记录,时间格式可以使用多种,如:YYYY-MM-DD HH:MM:SS,格式中的某些组成部分未进行填写,系统会直接进行默认填充。例如,如果日期部分未填写,则会直接显示当前日期。如果时间部分未填写,则缺省使用 00:00:00(午夜)。秒字段亦可留空,默认值为 “00”

journalctl _SYSTEMD_UNIT=cron.service --since "2018-03-27" --until "2018-03-27 01:00"

查看系统启动日志

如果 systemd-journald 配置了日志持久化存储 ,使用选项 --list-boots 会列出系统每次启动时的日志记录信息

# journalctl --list-boots
-2 93bdb6164... Sat 2020-01-04 21:07:28 EST—Sat 2020-01-04 21:19:37 EST
-1 7336cb823... Sun 2020-01-05 10:38:27 EST—Mon 2020-01-06 09:29:09 EST
0 eaebac25f... Sat 2020-01-18 14:11:41 EST—Sat 2020-01-18 16:03:37 EST

要查看某次系统启动的详细信息,可以使用 -b 选项指定

# journalctl -b 488e152a3e2b4f6bb86be366c55264e7

查看系统内核日志

使用选项 -k 可以查看系统内核相关日志。如果 systemd-journald 配置了日志持久化存储,使用 -b 选项可以查看以前系统的内核日志,比如想要查看本次系统启动的前一次启动的内核日志,可以使用以下命令

journalctl -k -b -1

参考链接

linux journalctl 命令