systemd/日志

出自 ArchWiki

systemd 有其自身的日志系统,称为 journal;不需要运行单独的日志守护进程。要读取日志,请使用 journalctl(1)

在 Arch Linux 中,目录 /var/log/journal/systemd 软件包的一部分,并且日志(当 Storage=/etc/systemd/journald.conf 中设置为 auto 时)将写入 /var/log/journal/。如果该目录被删除,systemd不会自动重新创建它,而是以非持久方式将其日志写入 /run/systemd/journal。但是,如果在 journald.conf 中添加 Storage=persistent 并且 重启 systemd-journald.service(或系统重启),则将重新创建该目录。

Systemd 日志通过优先级设施对消息进行分类。日志分类对应于经典的 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 mail 邮件系统 仍支持且有时使用的古老 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 导出该变量。
  • 虽然日志以二进制格式存储,但存储消息的内容不会被修改。这意味着它可以使用 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 snippets 配置覆盖机制,而不是编辑全局配置文件。在这种情况下,请将覆盖放在 [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以了解有关日志命名空间的详细信息。

手动清理日志文件

可以使用 e.g. rm/var/log/journal/ 全局删除日志文件,也可以使用 journalctl 根据各种标准进行修剪。例如

  • 移除已归档的日志文件,直到它们使用的磁盘空间降至 100MB 以下
    # 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.confForwardToSyslog=no,以避免系统开销,因为 rsyslogsyslog-ng 通过 自身 从日志中拉取消息。

有关配置的详细信息,请参阅 Syslog-ng#概述Syslog-ng#syslog-ng 和 systemd 日志,或 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 用户组admwheel 组的成员也被授予读取权限。

请参阅journalctl(1) § DESCRIPTION用户和组#用户组以了解更多信息。

桌面通知

桌面通知可以帮助您快速注意到错误消息,相比手动检查日志或根本没有注意到它们,提高了意识。

journalctl-desktop-notificationAUR 软件包为任何进程记录的每个错误消息提供自动桌面通知。有关更多详细信息和配置选项,请访问 GitLab 项目页面