systemd/日志
systemd 拥有自己的日志系统,称为 journal;不需要运行单独的日志守护进程。要读取日志,请使用 journalctl(1)。
在 Arch Linux 中,目录 /var/log/journal/
是 systemd 软件包的一部分,并且 journal(当 /etc/systemd/journald.conf
中的 Storage=
设置为 auto
时)将写入到 /var/log/journal/
。如果该目录被删除,systemd 将不会自动重新创建它,而是将其日志以非持久的方式写入到 /run/systemd/journal
。但是,如果将 Storage=persistent
添加到 journald.conf
并且 重启 systemd-journald.service
(或系统重启),则将重新创建该目录。
Systemd journal 通过优先级和工具对消息进行分类。日志分类对应于经典的 Syslog 协议(RFC 5424)。
优先级
syslog 严重性代码(在 systemd 中称为优先级)用于标记消息的重要性 RFC 5424 6.2.1。
值 | 严重性 | 关键词 | 描述 | 示例 |
---|---|---|---|---|
0 | 紧急 | emerg | 系统不可用 | 严重内核错误,systemd 核心转储。 应用程序不应使用此级别。 |
1 | 警报 | alert | 应立即纠正 | 重要子系统停止工作。数据丢失。kernel: BUG: unable to handle kernel paging request at ffffc90403238ffc .
|
2 | 严重 | crit | 严重情况 | 崩溃,核心转储。像熟悉的闪光systemd-coredump[25319]: Process 25310 (plugin-containe) of user 1000 dumped core 系统主要应用程序(如 X11)中的故障。 |
3 | 错误 | err | 错误情况 | 报告非致命错误kernel: usb 1-3: 3:1: cannot get freq at ep 0x84 ,systemd[1]: Failed unmounting /var. ,libvirtd[1720]: internal error: Failed to initialize a valid firewall backend
|
4 | 警告 | warning | 可能表明如果不采取措施,将会发生错误 | 非根文件系统仅剩余 1GB 可用空间。org.freedesktop. Notifications[1860]: (process:5999): Gtk-WARNING **: Locale not supported by C library. Using the fallback 'C' locale
|
5 | 注意 | notice | 不寻常但不是错误情况的事件 | systemd[1]: var.mount: Directory /var to mount over is not empty, mounting anyway ,gcr-prompter[4997]: Gtk: GtkDialog mapped without a transient parent. This is discouraged
|
6 | 信息 | info | 不需要操作的正常操作消息 | lvm[585]: 7 logical volume(s) in volume group "archvg" now active
|
7 | 调试 | debug | 可能需要先启用,仅对调试有用的消息 | kdeinit5[1900]: powerdevil: Scheduling inhibition from ":1.14" "firefox" with cookie 13 and reason "screen"
|
这些规则是建议,给定错误的优先级级别由应用程序开发人员自行决定。错误的级别总是可能高于或低于预期。
工具
syslog 工具代码用于指定记录消息的程序类型 RFC 5424 6.2.1。
工具代码 | 关键词 | 描述 | 信息 |
---|---|---|---|
0 | kern | 内核消息 | |
1 | user | 用户级别消息 | |
2 | 邮件系统 | 仍然支持且有时使用的过时的 POSIX(更多信息请参阅 mail(1)) | |
3 | daemon | 系统守护进程 | 所有守护进程,包括 systemd 及其子系统 |
4 | auth | 安全/授权消息 | 另请注意不同的工具 10 |
5 | syslog | syslogd 内部生成的消息 | 对于 syslogd 实现(systemd 未使用,请参阅工具 3) |
6 | lpr | 行式打印机子系统(过时的子系统) | |
7 | news | 网络新闻子系统(过时的子系统) | |
8 | uucp | UUCP 子系统(过时的子系统) | |
9 | 时钟守护进程 | systemd-timesyncd | |
10 | authpriv | 安全/授权消息 | 另请注意不同的工具 4 |
11 | ftp | FTP 守护进程 | |
12 | - | NTP 子系统 | |
13 | - | 日志审计 | |
14 | - | 日志警报 | |
15 | cron | 调度守护进程 | |
16 | local0 | 本地使用 0 (local0) | |
17 | local1 | 本地使用 1 (local1) | |
18 | local2 | 本地使用 2 (local2) | |
19 | local3 | 本地使用 3 (local3) | |
20 | local4 | 本地使用 4 (local4) | |
21 | local5 | 本地使用 5 (local5) | |
22 | local6 | 本地使用 6 (local6) | |
23 | local7 | 本地使用 7 (local7) |
要关注的有用工具:0、1、3、4、9、10、15。
过滤输出
journalctl 允许通过特定字段过滤输出。如果要显示的消息很多,或者必须过滤大时间跨度,则此命令的输出可能会被大量延迟。
示例
- 显示与
PATTERN
匹配的所有消息# journalctl --grep=PATTERN
- 显示来自本次启动的所有消息
# journalctl -b
但是,通常人们对不是来自当前启动的消息感兴趣,而是来自上一次启动的消息(例如,如果发生了不可恢复的系统崩溃)。这可以通过-b
标志的可选偏移参数来实现:journalctl -b -0
显示来自当前启动的消息,journalctl -b -1
来自上一次启动的消息,journalctl -b -2
来自第二次之前的启动,依此类推 – 您可以使用journalctl --list-boots
查看启动列表及其编号。有关完整描述,请参阅 journalctl(1);其语义比此处指示的更强大。 - 包含来自消息目录的日志消息的解释(如果可用)
# journalctl -x
请注意,将日志附加到错误报告和支持线程时不应使用此功能,以限制无关的输出。您可以通过运行journalctl --list-catalog
列出所有已知的目录条目。 - 显示自日期(和可选时间)以来的所有消息
# journalctl --since="2012-10-30 18:17:16"
- 显示 20 分钟前以来的所有消息
# journalctl --since "20 min ago"
- 跟踪新消息
# journalctl -f
- 显示特定可执行文件的所有消息
# journalctl /usr/lib/systemd/systemd
- 显示特定标识符的所有消息
# journalctl -t sudo
- 显示特定进程的所有消息
# journalctl _PID=1
- 显示特定单元的所有消息
# journalctl -u man-db.service
- 显示特定单元的用户服务的所有消息
$ journalctl --user -u dbus
- 显示内核环缓冲区
# journalctl -k
- 仅显示错误、严重和警报优先级消息
# journalctl -p err..alert
您也可以使用数字日志级别,例如journalctl -p 3..1
。如果使用单个数字/日志级别,journalctl -p 3
,则也包括所有更高优先级的日志级别(在本例中为 0 到 3)。 - 通过过滤 syslog 工具显示等效于 auth.log 的内容
# journalctl SYSLOG_FACILITY=10
- 如果日志目录(默认情况下位于
/var/log/journal
下)包含大量日志数据,则journalctl
可能需要几分钟才能过滤输出。使用--file
选项强制journalctl
仅查看最新的日志可以显着加快速度# journalctl --file /var/log/journal/*/system.journal -f
有关详细信息,请参阅 journalctl(1),systemd.journal-fields(7),或 Lennart Poettering 的博客文章。
- 默认情况下,journalctl 会截断长于屏幕宽度的行,但在某些情况下,最好启用换行而不是截断。这可以通过
SYSTEMD_LESS
环境变量 来控制,该变量包含传递给 less(默认分页器)的选项,默认值为FRSXMK
(有关详细信息,请参阅 less(1) 和 journalctl(1))。
- 通过省略
S
选项,输出将换行而不是截断。例如,按如下方式启动 journalctl$ SYSTEMD_LESS=FRXMK journalctl
- 要将此行为设置为默认行为,请从
~/.bashrc
或~/.zshrc
导出该变量。
- 虽然 journal 以二进制格式存储,但存储消息的内容不会被修改。这意味着可以使用 strings 查看它,例如在未安装 systemd 的环境中进行恢复,例如
$ strings /mnt/arch/var/log/journal/af4967d77fba44c6b093d0e9862f6ddd/system.journal | grep -i message
技巧与诀窍
日志大小限制
如果日志是持久的(非易失性的),则其大小限制设置为底层文件系统大小的默认值 10%,但上限为 4 GiB。例如,如果 /var/log/journal/
位于 20 GiB 分区上,则日志数据最多可占用 2 GiB。在 50 GiB 分区上,最大为 4 GiB。要确认系统上的当前限制,请查看 systemd-journald
单元日志
# journalctl -b -u systemd-journald
持久日志的最大大小可以通过取消注释并更改以下内容来控制
/etc/systemd/journald.conf
SystemMaxUse=50M
也可以使用 drop-in 片段配置覆盖机制,而不是编辑全局配置文件。在这种情况下,将覆盖放在 [Journal]
标头下
/etc/systemd/journald.conf.d/00-journal-size.conf
[Journal] SystemMaxUse=50M
重启 systemd-journald.service
以应用新限制。
有关更多信息,请参阅 journald.conf(5)。
每个单元的日志命名空间的大小限制
编辑 要配置的服务(例如 sshd)的单元文件,并在 [Service]
部分中添加 LogNamespace=ssh
。
然后通过复制 /etc/systemd/journald.conf
创建 /etc/systemd/journald@ssh.conf
。之后,编辑 journald@ssh.conf
并根据您的喜好调整 SystemMaxUse
。
重启 服务应自动启动新的日志服务 systemd-journald@ssh.service
。可以使用 journalctl --namespace ssh
查看来自命名空间服务的日志。
有关日志命名空间的详细信息,请参阅 systemd-journald.service(8) § JOURNAL NAMESPACES。
手动清理日志文件
可以使用 例如 rm
从 /var/log/journal/
全局删除日志文件,或者可以使用 journalctl
根据各种标准修剪日志文件。例如
- 删除已归档的日志文件,直到它们使用的磁盘空间降至 100M 以下
# journalctl --vacuum-size=100M
- 使所有日志文件不包含超过 2 周的数据。
# journalctl --vacuum-time=2weeks
日志文件必须先轮换出来并变为非活动状态,然后才能被 vacuum 命令修剪。可以通过运行 journalctl --rotate
来完成日志文件的轮换。--rotate
参数也可以与一个或多个 vacuum 标准参数一起提供,以执行轮换,然后在单个命令中修剪文件。
有关更多信息,请参阅 journalctl(1)。
Journald 与 syslog 协同工作
通过让 systemd 通过套接字 /run/systemd/journal/syslog
转发所有消息,可以提供与经典的、非 journald 感知的 syslog 实现的兼容性。为了使 syslog 守护进程与 journal 一起工作,它必须绑定到此套接字而不是 /dev/log
(官方公告)。
用于转发到套接字的默认 journald.conf
是 ForwardToSyslog=no
,以避免系统开销,因为 rsyslog 或 syslog-ng 通过 自身 从 journal 中拉取消息。
有关配置的详细信息,请分别参阅 Syslog-ng#概述 和 Syslog-ng#syslog-ng 与 systemd journal,或 rsyslog。
将 journald 转发到 /dev/tty12
创建一个 drop-in 目录 /etc/systemd/journald.conf.d
并在其中创建一个 fw-tty12.conf
文件
/etc/systemd/journald.conf.d/fw-tty12.conf
[Journal] ForwardToConsole=yes TTYPath=/dev/tty12
然后重启 systemd-journald.service
。
指定要查看的不同日志
可能需要检查另一个已停机的系统的日志,例如从 live 系统启动以恢复生产系统。在这种情况下,可以将磁盘挂载到例如 /mnt
,并通过 -D
/--directory
指定日志路径,如下所示
# journalctl -D /mnt/var/log/journal -e
用户访问日志
默认情况下,普通用户只能访问他们自己的每用户日志。要授予普通用户系统日志的读取权限,您可以将该用户添加到 systemd-journal
用户组。adm
和 wheel
组的成员也被授予读取权限。
有关更多信息,请参阅 journalctl(1) § DESCRIPTION 和 用户和组#用户组。
桌面通知
桌面通知可以帮助您快速注意到错误消息,从而提高意识,而无需手动检查日志或根本没有注意到它们。
journalctl-desktop-notificationAUR 软件包为任何进程记录的每个错误消息提供自动桌面通知。有关更多详细信息和配置选项,请访问 GitLab 项目页面。