跳转到内容跳转到页面导航:上一页 [访问键 p]/下一页 [访问键 n]
适用于 openSUSE Leap 15.6

11 journalctl: 查询 systemd 日志 编辑源文件

systemd 具有自己的日志系统,称为 journal。 无需运行基于 syslog 的服务,因为所有系统事件都会写入 journal。

journal 本身是一个由 systemd 管理的系统服务。 它的完整名称是 systemd-journald.service。 它通过维护基于从内核、用户进程、标准输入和系统服务错误收到的日志信息结构化的索引 journal 来收集和存储日志数据。 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
[...]

11.1 使 journal 持久化 编辑源文件

journal 默认将日志数据存储在 /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/ 中。

11.2 journalctl: 有用的开关 编辑源文件

本节介绍几个常用的选项,以增强默认的 journalctl 行为。 所有开关都在 journalctl 手册页中描述,man 1 journalctl

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

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

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

仅显示最新的 journal 消息,并在将新日志条目添加到 journal 时打印它们。

打印消息并跳转到 journal 的末尾,以便在分页器中可以看到最新的条目。

-r

以相反的顺序打印 journal 的消息,以便首先列出最新的条目。

-k

仅显示内核消息。 这等效于字段匹配 _TRANSPORT=kernel(请参阅 第 11.3.3 节,“基于字段进行过滤”)。

-u

仅显示指定 systemd 单位的消息。 这等效于字段匹配 _SYSTEMD_UNIT=UNIT(请参阅 第 11.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.

11.3 过滤 journal 输出 编辑源文件

在不使用开关的情况下调用时,journalctl 显示 journal 的完整内容,首先列出最旧的条目。 可以通过特定的开关和字段来过滤输出。

11.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

如果您需要查看上一个启动的 journal 消息,请添加一个偏移量参数。 以下示例输出上一个启动的消息

> sudo journalctl -b -1

另一种方法是根据启动 ID 列出启动消息。 为此,请使用 _BOOT_ID 字段

> sudo journalctl _BOOT_ID=156019a44a774a0bb0148a92df4af81b

11.3.2 基于时间间隔进行过滤 编辑源文件

您可以指定开始和/或结束日期来过滤 journalctl 的输出。 日期规范应为 2014-06-30 9:17:16 格式。 如果省略时间部分,则假定为午夜。 如果省略秒数,则假定为 :00。 如果省略日期部分,则假定为当前日期。 除了数字表达式之外,您还可以指定关键字 yesterdaytodaytomorrow。 它们指的是当前日期前一天的午夜、当前日期或当前日期后一天的午夜。 如果您指定 now,则它指的是当前时间。 您还可以指定以 -+ 为前缀的相对时间,指的是当前时间之前或之后的时间。

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

> sudo journalctl --since "now" -f

显示从午夜到凌晨 3:20 的所有消息

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

11.3.3 基于字段进行过滤 编辑源文件

您可以根据特定的字段过滤 journal 的输出。 要匹配的字段的语法是 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。 以下示例显示来自 Avahi 服务进程 ID 为 1480 的所有消息以及来自 D-Bus 服务的所有消息

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

11.4 调查 systemd 错误 编辑源文件

本节介绍一个简单的示例,说明如何找到并修复 systemdapache2 启动期间报告的错误。

  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 [...]

11.5 Journald 配置 编辑源文件

可以通过修改 /etc/systemd/journald.conf 来调整 systemd-journald 服务的行为。 本节仅介绍基本的选项设置。 有关完整的文件说明,请参阅 man 5 journald.conf。 您需要使用以下命令重新启动 journal 才能使更改生效

> sudo systemctl restart systemd-journald

11.5.1 更改 journal 大小限制 编辑源文件

如果将 journal 日志数据保存到持久位置(请参阅 第 11.1 节,“使 journal 持久化”),它将使用 /var/log/journal 所在的文件系统的多达 10%。 例如,如果 /var/log/journal 位于 30 GB 的 /var 分区上,journal 可能会使用磁盘空间的最多 3 GB。 要更改此限制,请更改(并取消注释)SystemMaxUse 选项

SystemMaxUse=50M

11.5.2 将 journal 转发到 /dev/ttyX 编辑源文件

您可以将 journal 转发到终端设备,以便在首选终端屏幕上告知您系统消息,例如 /dev/tty12。 更改以下 journald 选项为

ForwardToConsole=yes
TTYPath=/dev/tty12

11.5.3 将 journal 转发到 syslog facility 编辑源文件

Journald 与传统的 syslog 实现(例如 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

11.6 使用 YaST 过滤 systemd journal 编辑源文件

为了轻松过滤 systemd journal(而无需处理 journalctl 语法),您可以使用 YaST journal 模块。 在使用 sudo zypper in yast2-journal 安装它后,从 YaST 中选择 系统 › Systemd Journal 启动它。 或者,您可以从命令行启动它,输入 sudo yast2 journal

YaST systemd journal
图 11.1: YaST systemd journal

该模块以表格形式显示日志条目。 顶部的搜索框允许您搜索包含特定字符的条目,类似于使用 grep。 要按日期和时间、单元、文件或优先级过滤条目,请单击 更改过滤器 并设置相应的选项。

11.7 在 GNOME 中查看日志 编辑源文件

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

打印此页面