跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Desktop 文档 / 管理指南 / 系统 / journalctl:查询 systemd 日志
适用范围 SUSE Linux Enterprise Desktop 15 SP5

21 journalctl:查询 systemd 日志

systemd 具有自己的日志记录系统,称作日志。由于所有系统事件都会写入日志,因此不需要运行基于 syslog 的服务。

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

> sudo systemctl status systemd-journald
systemd-journald.service - Journal Service
   Loaded: loaded (/usr/lib/systemd/system/systemd-journald.service; static)
   Active: active (running) since Mon 2014-05-26 08:36:59 EDT; 3 days ago
     Docs: man:systemd-journald.service(8)
           man:journald.conf(5)
 Main PID: 413 (systemd-journal)
   Status: "Processing requests..."
   CGroup: /system.slice/systemd-journald.service
           └─413 /usr/lib/systemd/systemd-journald
[...]

21.1 将日志设为永久

默认情况下,日志在 /run/log/journal/ 中存储日志数据。由于 /run/ 目录本质上具有易失性,因此,在重引导时会丢失日志数据。要永久保存日志数据,创建目录 /var/log/journal/ 并确保它具有正确的访问模式和所有权,以便 systemd-journald 服务能够存储其数据。要切换到永久日志记录,请执行以下命令:

> sudo  mkdir /var/log/journal
> sudo  systemd-tmpfiles --create --prefix=/var/log/journal
> sudo  journalctl --flush

存储在 /run/log/journal/ 中的任何日志数据都将刷新到 /var/log/journal/ 中。

21.2 journalctl:有用的开关

本节介绍了一些可用来增强 journalctl 默认行为的常见有用选项。journalctl 手册页 man 1 journalctl 中介绍了所有开关。

提示
提示:与特定可执行文件相关的消息

要显示与特定可执行文件相关的所有日志消息,请指定该可执行文件的完整路径:

> sudo journalctl /usr/lib/systemd/systemd
-f

仅显示最近的日志消息,另外,在将新的日志项添加到日志时会列显这些新项。

列显消息并跳转到日志末尾,以便在页导航中显示最新的项。

-r

以倒序列显日志消息,让最新的项列在最前面。

-k

仅显示内核消息。这与字段匹配 _TRANSPORT=kernel 相同(请参见第 21.3.3 节 “根据字段过滤”)。

-u

仅显示指定 systemd 单元的消息。这与字段匹配 _SYSTEMD_UNIT=UNIT 相同(请参见第 21.3.3 节 “根据字段过滤”)。

> sudo journalctl -u apache2
[...]
Jun 03 10:07:11 pinkiepie systemd[1]: Starting The Apache Webserver...
Jun 03 10:07:12 pinkiepie systemd[1]: Started The Apache Webserver.

21.3 过滤日志输出

如果不结合任何开关调用 journalctl,它将显示日志的整个内容,最旧的项列在最前面。您可按特定的开关和字段过滤输出。

21.3.1 根据引导编号过滤

journalctl 可以根据特定的系统引导过滤消息。要列出所有可用引导,请运行

> sudo journalctl --list-boots
-1 097ed2cd99124a2391d2cffab1b566f0 Mon 2014-05-26 08:36:56 EDT—Fri 2014-05-30 05:33:44 EDT
 0 156019a44a774a0bb0148a92df4af81b Fri 2014-05-30 05:34:09 EDT—Fri 2014-05-30 06:15:01 EDT

第一列列出引导偏移:0 表示当前引导,-1 表示上一次引导,-2 表示再上一次引导,以此类推。第二列包含引导 ID 后接特定引导的限制时戳。

显示当前引导中的所有消息:

> sudo journalctl -b

如果需要查看来自前一引导的日志消息,请加一个偏移参数。下面的示例将输出前一引导的消息:

> sudo journalctl -b -1

另一种方法是根据引导 ID 列出引导消息。要实现此目的,请使用 _BOOT_ID 字段:

> sudo journalctl _BOOT_ID=156019a44a774a0bb0148a92df4af81b

21.3.2 根据时间间隔过滤

您可通过指定开始日期和/或结束日期来过滤 journalctl 的输出。日期规范应采用类似于“2014-06-30 9:17:16”的格式。如果省略时间部分,则会假设为午夜。如果省略秒,则会假设为“:00”。如果省略日期部分,则会假设为当日。您也可以不采用数字表示,而是指定关键字“yesterday”、“today”或“tomorrow”。它们表示当日前一天、当日或者当日后一天的午夜。如果指定“now”,则表示当前时间。您还可以指定以 -+ 为前缀的相对时间,分别表示当前时间之前或之后的特定时间。

仅显示从现在开始生成的新消息,并持续更新输出:

> sudo journalctl --since "now" -f

显示从昨天午夜到 3:20AM 的所有消息:

> sudo journalctl --since "today" --until "3:20"

21.3.3 根据字段过滤

您可以按特定的字段过滤日志输出。要匹配的字段语法为 FIELD_NAME=MATCHED_VALUE,例如 _SYSTEMD_UNIT=httpd.service。您可以在单个查询中指定多个匹配条件,以进一步过滤输出消息。有关默认字段的列表,请参见 man 7 systemd.journal-fields

显示特定进程 ID 生成的消息:

> sudo journalctl _PID=1039

显示属于特定用户 ID 的消息:

# journalctl _UID=1000

显示来自内核环缓冲区的消息(与 dmesg 的生成结果相同):

> sudo journalctl _TRANSPORT=kernel

显示来自服务的标准输出或错误输出的消息:

> sudo journalctl _TRANSPORT=stdout

仅显示指定服务生成的消息:

> sudo journalctl _SYSTEMD_UNIT=avahi-daemon.service

如果指定了两个不同的字段,则仅显示同时与两个表达式匹配的项:

> sudo journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1488

如果两个匹配条件引用了相同的字段,则显示与两个表达式中任意一个匹配的所有项:

> sudo journalctl _SYSTEMD_UNIT=avahi-daemon.service _SYSTEMD_UNIT=dbus.service

您可以使用“+”分隔符将两个表达式组合成一个逻辑“OR”。以下示例将显示来自进程 ID 为 1480 的 Avahi 服务进程的所有消息,以及来自 D-Bus 服务的所有消息:

> sudo journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1480 + _SYSTEMD_UNIT=dbus.service

21.4 调查 systemd 错误

本节将介绍一个简单的示例,演示如何找出并修复在 apache2 启动期间 systemd 报告的错误。

  1. 尝试启动 apache2 服务:

    # systemctl start apache2
    Job for apache2.service failed. See 'systemctl status apache2' and 'journalctl -xn' for details.
  2. 我们来看看该服务的状态如何:

    > sudo systemctl status apache2
    apache2.service - The Apache Webserver
       Loaded: loaded (/usr/lib/systemd/system/apache2.service; disabled)
       Active: failed (Result: exit-code) since Tue 2014-06-03 11:08:13 CEST; 7min ago
      Process: 11026 ExecStop=/usr/sbin/start_apache2 -D SYSTEMD -DFOREGROUND \
               -k graceful-stop (code=exited, status=1/FAILURE)

    导致错误的进程 ID 为 11026。

  3. 显示与进程 ID 11026 相关的详细消息:

    > sudo journalctl -o verbose _PID=11026
    [...]
    MESSAGE=AH00526: Syntax error on line 6 of /etc/apache2/default-server.conf:
    [...]
    MESSAGE=Invalid command 'DocumenttRoot', perhaps misspelled or defined by a module
    [...]
  4. 更正 /etc/apache2/default-server.conf 中的拼写错误,启动 apache2 服务,然后列显其状态:

    > sudo systemctl start apache2 && systemctl status apache2
    apache2.service - The Apache Webserver
       Loaded: loaded (/usr/lib/systemd/system/apache2.service; disabled)
       Active: active (running) since Tue 2014-06-03 11:26:24 CEST; 4ms ago
      Process: 11026 ExecStop=/usr/sbin/start_apache2 -D SYSTEMD -DFOREGROUND
               -k graceful-stop (code=exited, status=1/FAILURE)
     Main PID: 11263 (httpd2-prefork)
       Status: "Processing requests..."
       CGroup: /system.slice/apache2.service
               ├─11263 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
               ├─11280 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
               ├─11281 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
               ├─11282 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
               ├─11283 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
               └─11285 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]

21.5 Journald 配置

通过修改 /etc/systemd/journald.conf 可调整 systemd-journald 服务的行为。本节只介绍了基本的选项设置。有关完整的文件描述,请参见 man 5 journald.conf。要使更改生效,需要使用以下命令重启动日志

> sudo systemctl restart systemd-journald

21.5.1 更改日志大小限制

如果将日志数据保存到永久位置(请参见第 21.1 节 “将日志设为永久”),这些数据最多会占用 /var/log/journal 所在文件系统空间的 10%。例如,如果 /var/log/journal 位于 30 GB 的 /var 的分区中,则日志最多会占用 3 GB 磁盘空间。要更改此限制,请更改(并取消注释)SystemMaxUse 选项:

SystemMaxUse=50M

21.5.2 将日志转发到 /dev/ttyX

您可以将日志转发到终端设备,以便在首选的终端屏幕(例如 /dev/tty12)上显示相关的系统消息。将以下 journald 选项更改为

ForwardToConsole=yes
TTYPath=/dev/tty12

21.5.3 将日志转发到系统日志工具

Journald 与传统的系统日志实现工具(例如 rsyslog)向后兼容。请确保满足以下条件:

  • 已安装 rsyslog。

    > sudo rpm -q rsyslog
    rsyslog-7.4.8-2.16.x86_64
  • 已启用 rsyslog 服务。

    > sudo systemctl is-enabled rsyslog
    enabled
  • 已在 /etc/systemd/journald.conf 中启用转发到 syslog 设置。

    ForwardToSyslog=yes

21.6 使用 YaST 过滤 systemd 日志

过滤 systemd 日志的简单方法(无需处理 journalctl 语法)是使用 YaST 日志模块。使用 sudo zypper in yast2-journal 安装该模块后,请在 YaST 中选择系统 › Systemd 日志启动该模块。也可以在命令行中输入 sudo yast2 journal 来启动该模块。

YaST systemd 日志
图 21.1︰ YaST systemd 日志

模块将在表中显示日志项。使用顶部的搜索框可以搜索包含特定字符的项,这类似于使用 grep。要按日期和时间、单位、文件或优先级过滤项,请单击更改过滤器,然后设置相应的选项。

21.7 在 GNOME 中查看日志

您可以使用 GNOME 日志来查看日志。可从应用程序菜单启动它。要查看系统日志消息,需要以 root 身份运行它,例如使用 xdg-su gnome-logs。按 AltF2 时可执行此命令。