Journal ( 日志 )

传统的系统日志通常使用 Syslog,Systemd 使用 Journal 统一管理系统日志。

Journal 的日志是二进制形式保存在硬盘上的,这点让很多人反对使用 Journal,尤其是当系统宕机时,无法方便的查看出错日志。但 Journal 仍可以配合 Syslog 使用,可将 Journal 的日志转发至 Syslog,之后用喜欢的方式进行处理。

确保采用日志永久存储

默认情况下,Journal 会将日志保存在 /var/log/journal,但前提是这个目录存在,如果此目录不存在,则 systemd 不会自动创建该文件夹,并将日志输出至 /run/systemd/journal,此目录中的内容会在每次开机时被清空。

重建日志保存目录

重建目录应确保目录正确,目录权限正确。

$ sudo mkdir -p /var/log/journal
$ sudo chown -R :systemd-journal /var/log/journal
$ sudo chmod 2775 /var/log/journal
$ sudo systemctl restart systemd-journald.service

查看日志

查看 Journal 的日志须使用 journalctl 命令。

如不加任何参数,则输出所有日志,但一般我们需要对日志进行过滤,journalctl 提供了许多过滤日志的选项,但最常用的是输出特定 systemd 单元的日志信息。

$ journalctl -eu ntp
Jan 21 03:32:07 debian ntpd[3783]: Soliciting pool server 193.182.111.142
Jan 21 03:32:18 debian ntpd[3783]: Soliciting pool server 144.76.76.107
Jan 21 03:32:39 debian ntpd[3783]: Soliciting pool server 94.237.64.20
Jan 21 03:32:57 debian ntpd[3783]: Soliciting pool server 120.25.115.20
Jan 21 03:32:58 debian ntpd[3783]: Soliciting pool server 84.16.73.33
Jan 21 03:33:14 debian ntpd[3783]: Soliciting pool server 185.255.55.20
Jan 21 03:33:24 debian ntpd[3783]: Soliciting pool server 193.182.111.14
Jan 21 03:33:43 debian ntpd[3783]: Soliciting pool server 193.182.111.12
Jan 21 03:34:04 debian ntpd[3783]: Soliciting pool server 185.255.55.20
Jan 21 03:34:19 debian ntpd[3783]: Soliciting pool server 193.182.111.142
Jan 21 03:34:28 debian ntpd[3783]: Soliciting pool server 144.76.76.107
Jan 21 03:34:48 debian ntpd[3783]: Soliciting pool server 5.79.108.34
Jan 21 03:35:10 debian ntpd[3783]: Soliciting pool server 162.159.200.123
Jan 21 03:39:09 debian ntpd[3783]: 122.117.253.246 local addr 192.168.50.157 -> <null>
Jan 21 22:25:42 debian ntpd[3783]: leapsecond file ('/usr/share/zoneinfo/leap-seconds.list'): expired less than 25 days
Jan 22 22:25:42 debian ntpd[3783]: leapsecond file ('/usr/share/zoneinfo/leap-seconds.list'): expired less than 26 days
Jan 23 22:25:42 debian ntpd[3783]: leapsecond file ('/usr/share/zoneinfo/leap-seconds.list'): expired less than 27 days
Jan 24 22:25:42 debian ntpd[3783]: leapsecond file ('/usr/share/zoneinfo/leap-seconds.list'): expired less than 28 days
Jan 25 22:25:42 debian ntpd[3783]: leapsecond file ('/usr/share/zoneinfo/leap-seconds.list'): expired less than 29 days
Jan 26 22:25:42 debian ntpd[3783]: leapsecond file ('/usr/share/zoneinfo/leap-seconds.list'): expired less than 30 days
Jan 27 22:25:42 debian ntpd[3783]: leapsecond file ('/usr/share/zoneinfo/leap-seconds.list'): expired less than 31 days
Jan 28 22:25:42 debian ntpd[3783]: leapsecond file ('/usr/share/zoneinfo/leap-seconds.list'): expired less than 32 days
Jan 29 22:25:42 debian ntpd[3783]: leapsecond file ('/usr/share/zoneinfo/leap-seconds.list'): expired less than 33 days
Jan 30 22:25:42 debian ntpd[3783]: leapsecond file ('/usr/share/zoneinfo/leap-seconds.list'): expired less than 34 days
Jan 31 22:25:42 debian ntpd[3783]: leapsecond file ('/usr/share/zoneinfo/leap-seconds.list'): expired less than 35 days
Feb 01 22:25:42 debian ntpd[3783]: leapsecond file ('/usr/share/zoneinfo/leap-seconds.list'): expired less than 36 days
Feb 02 22:25:42 debian ntpd[3783]: leapsecond file ('/usr/share/zoneinfo/leap-seconds.list'): expired less than 37 days
Feb 03 22:25:42 debian ntpd[3783]: leapsecond file ('/usr/share/zoneinfo/leap-seconds.list'): expired less than 38 days
Feb 04 22:25:42 debian ntpd[3783]: leapsecond file ('/usr/share/zoneinfo/leap-seconds.list'): expired less than 39 days

常用参数表:

  • -f 只显示最近的日志信息,另外,当新的日志被写入时会自动显示 ( 类似于 tail )

  • -e 显示信息并跳转到日志结尾,可直接看到最近的几条日志

  • -r 以反向顺序显示日志

  • -k 只显示内核信息

  • -u 只显示指定的 systemd 单元信息

配置文件相关

对 Journald 的更多配置须修改 /etc/systemd/journald.conf,可查看 journald.conf(5) 获取完整信息,每次修改配置文件须重启服务:

$ sudo systemctl restart systemd-journald

限制日志保存大小

默认情况下,Journald 将日志最大保存容量设定为整个磁盘分区的 10%,但上限为 4GB ,如需要改变这一项,则取消注释并修改配置文件中的 SystemMaxUse 选项,例如要限制最多使用 50MB,则设定为:

SystemMaxUse=50M

将日志转发至 Syslog

Journald 可以与 Syslog 共存且同时工作,并且向下兼容。

要将 Journald 收集的日志转发至 Syslog,首先保证系统安装且启动了 rsyslog,后修改配置文件。

# 安装 rsyslog
$ sudo apt install rsyslog
# 启动 rsyslog 服务
$ sudo systemctl enable --now rsyslog
# 修改配置文件
$ sudo vi /etc/systemd/journald.conf

取消注释并修改下面一行

ForwardToSyslog=yes

别忘了重启 systemd-journald.service

$ sudo systemctl restart systemd-journald

阅读资料:

journalctl:查询 systemd 日记

[systemd (简体中文)/Journal (简体中文)](https://wiki.archlinux.org/index.php/Systemd_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)/Journal_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87))

最后更新于