systemd 具有自己的日志系统,称为 journal。 无需运行基于 syslog 的服务,因为所有系统事件都会写入 journal。
journal 本身是一个由 systemd 管理的系统服务。 它的完整名称是 systemd-journald.service。 它通过维护基于从内核、用户进程、标准输入和系统服务错误收到的日志信息结构化的索引 journal 来收集和存储日志数据。 systemd-journald 服务默认情况下处于启用状态
>sudosystemctl 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 [...]
journal 默认将日志数据存储在 /run/log/journal/ 中。 由于 /run/ 目录本质上是易失的,因此重启时会丢失日志数据。 要使日志数据持久化,请创建目录 /var/log/journal/ 并确保它具有正确的访问模式和所有权,以便 systemd-journald 服务可以存储其数据。 要切换到持久化日志记录,请执行以下命令
>sudomkdir /var/log/journal>sudosystemd-tmpfiles --create --prefix=/var/log/journal>sudojournalctl --flush
存储在 /run/log/journal/ 中的任何日志数据都将被刷新到 /var/log/journal/ 中。
本节介绍几个常用的选项,以增强默认的 journalctl 行为。 所有开关都在 journalctl 手册页中描述,man 1 journalctl。
要显示与特定可执行文件相关的所有 journal 消息,请指定可执行文件的完整路径
>sudojournalctl /usr/lib/systemd/systemd
仅显示最新的 journal 消息,并在将新日志条目添加到 journal 时打印它们。
打印消息并跳转到 journal 的末尾,以便在分页器中可以看到最新的条目。
以相反的顺序打印 journal 的消息,以便首先列出最新的条目。
仅显示内核消息。 这等效于字段匹配 _TRANSPORT=kernel(请参阅 第 11.3.3 节,“基于字段进行过滤”)。
仅显示指定 systemd 单位的消息。 这等效于字段匹配 _SYSTEMD_UNIT=UNIT(请参阅 第 11.3.3 节,“基于字段进行过滤”)。
>sudojournalctl -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.
在不使用开关的情况下调用时,journalctl 显示 journal 的完整内容,首先列出最旧的条目。 可以通过特定的开关和字段来过滤输出。
journalctl 可以根据特定的系统启动过滤消息。 要列出所有可用的启动,请运行
>sudojournalctl --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,后跟特定启动的限制时间戳。
显示当前启动的所有消息
>sudojournalctl -b
如果您需要查看上一个启动的 journal 消息,请添加一个偏移量参数。 以下示例输出上一个启动的消息
>sudojournalctl -b -1
另一种方法是根据启动 ID 列出启动消息。 为此,请使用 _BOOT_ID 字段
>sudojournalctl _BOOT_ID=156019a44a774a0bb0148a92df4af81b
您可以指定开始和/或结束日期来过滤 journalctl 的输出。 日期规范应为 2014-06-30 9:17:16 格式。 如果省略时间部分,则假定为午夜。 如果省略秒数,则假定为 :00。 如果省略日期部分,则假定为当前日期。 除了数字表达式之外,您还可以指定关键字 yesterday、today 或 tomorrow。 它们指的是当前日期前一天的午夜、当前日期或当前日期后一天的午夜。 如果您指定 now,则它指的是当前时间。 您还可以指定以 - 或 + 为前缀的相对时间,指的是当前时间之前或之后的时间。
仅显示从现在开始的新消息,并持续更新输出
>sudojournalctl --since "now" -f
显示从午夜到凌晨 3:20 的所有消息
>sudojournalctl --since "today" --until "3:20"
您可以根据特定的字段过滤 journal 的输出。 要匹配的字段的语法是 FIELD_NAME=MATCHED_VALUE,例如 _SYSTEMD_UNIT=httpd.service。 您可以在单个查询中指定多个匹配项,以进一步过滤输出消息。 请参阅 man 7 systemd.journal-fields 以获取默认字段列表。
显示由特定进程 ID 生成的消息
>sudojournalctl _PID=1039
显示属于特定用户 ID 的消息
# journalctl _UID=1000
显示来自内核环形缓冲区的消息(与 dmesg 生成的消息相同)
>sudojournalctl _TRANSPORT=kernel
显示来自服务的标准或错误输出的消息
>sudojournalctl _TRANSPORT=stdout
仅显示由指定服务生成的消息
>sudojournalctl _SYSTEMD_UNIT=avahi-daemon.service
如果指定了两个不同的字段,则仅显示同时匹配这两个表达式的条目
>sudojournalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1488
如果两个匹配项引用相同的字段,则显示匹配任一表达式的所有条目
>sudojournalctl _SYSTEMD_UNIT=avahi-daemon.service _SYSTEMD_UNIT=dbus.service
您可以使用 + 分隔符将两个表达式组合为逻辑 OR。 以下示例显示来自 Avahi 服务进程 ID 为 1480 的所有消息以及来自 D-Bus 服务的所有消息
>sudojournalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1480 + _SYSTEMD_UNIT=dbus.service
本节介绍一个简单的示例,说明如何找到并修复 systemd 在 apache2 启动期间报告的错误。
尝试启动 apache2 服务
# systemctl start apache2 Job for apache2.service failed. See 'systemctl status apache2' and 'journalctl -xn' for details.
让我们看看服务的状态
>sudosystemctl 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。
显示进程 ID 11026 相关的消息的详细版本
>sudojournalctl -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 [...]
修复 /etc/apache2/default-server.conf 中的拼写错误,启动 apache2 服务并打印其状态
>sudosystemctl 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 [...]
可以通过修改 /etc/systemd/journald.conf 来调整 systemd-journald 服务的行为。 本节仅介绍基本的选项设置。 有关完整的文件说明,请参阅 man 5 journald.conf。 您需要使用以下命令重新启动 journal 才能使更改生效
>sudosystemctl restart systemd-journald
如果将 journal 日志数据保存到持久位置(请参阅 第 11.1 节,“使 journal 持久化”),它将使用 /var/log/journal 所在的文件系统的多达 10%。 例如,如果 /var/log/journal 位于 30 GB 的 /var 分区上,journal 可能会使用磁盘空间的最多 3 GB。 要更改此限制,请更改(并取消注释)SystemMaxUse 选项
SystemMaxUse=50M
您可以将 journal 转发到终端设备,以便在首选终端屏幕上告知您系统消息,例如 /dev/tty12。 更改以下 journald 选项为
ForwardToConsole=yes TTYPath=/dev/tty12
为了轻松过滤 systemd journal(而无需处理 journalctl 语法),您可以使用 YaST journal 模块。 在使用 sudo zypper in yast2-journal 安装它后,从 YaST 中选择 › 启动它。 或者,您可以从命令行启动它,输入 sudo yast2 journal。
该模块以表格形式显示日志条目。 顶部的搜索框允许您搜索包含特定字符的条目,类似于使用 grep。 要按日期和时间、单元、文件或优先级过滤条目,请单击 并设置相应的选项。