15 journalctl
:查询 systemd
日记 #
systemd
在取代 SUSE Linux Enterprise 12 中的传统 init 脚本时(参见第 13 章 “systemd
守护程序”),引入了自身的称为日记的日志记录系统。由于所有系统事件都将写入到日记中,因此,用户不再需要运行基于 syslog
的服务。
日记本身是 systemd
管理的系统服务,全名为 systemd-journald.service
。它会根据从内核、用户进程、标准输入和系统服务错误收到的日志记录信息,维护结构化的索引日记,并以此方式来收集和储存日志记录数据。systemd-journald
服务默认处于启用状态。
# 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 [...]
15.1 将日记设为永久 #
默认情况下,日记在 /run/log/journal/
中储存日志数据。由于 /run/
目录具有易失本性,因此,在重引导时会丢失日志数据。要永久保存日志数据,/var/log/journal/
目录必须存在且具有正确的所有权和权限,如此,systemd-journald 服务便可在其中储存其数据。systemd
将为您创建该目录,如果您执行以下操作,它将会切换到永久日志记录:
以
root
身份打开/etc/systemd/journald.conf
进行编辑。# vi /etc/systemd/journald.conf
将包含
Storage=
的行取消注释,并将它更改为[...] [Journal] Storage=persistent #Compress=yes [...]
保存该文件,然后重启动 systemd-journald:
systemctl restart systemd-journald
15.2 journalctl
的有用开关 #
本节介绍了一些可用来增强 journalctl
默认行为的常见有用选项。journalctl
手册页 man 1 journalctl
中介绍了所有开关。
要显示与特定可执行文件相关的所有日记讯息,请指定该可执行文件的完整路径:
journalctl /usr/lib/systemd/systemd
- -f
仅显示最近的日记讯息,另外,在将新的日志项添加到日记时会列显这些新项。
- -e
列显讯息并跳转到日记末尾,以便在页导航中显示最新的项。
- -r
以倒序列显日记讯息,让最新的项列在最前面。
- -k
仅显示内核讯息。这等效于字段匹配
_TRANSPORT=kernel
(参见第 15.3.3 节 “根据字段过滤”)。- -u
仅显示指定
systemd
单元的讯息。这等效于字段匹配_SYSTEMD_UNIT=UNIT
(参见 第 15.3.3 节 “根据字段过滤”)。# 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.
15.3 过滤日记输出 #
如果不结合任何开关调用 journalctl
,它将显示日记的整个内容,最旧的项列在最前面。您可按特定的开关和字段过滤输出。
15.3.1 根据引导编号过滤 #
journalctl
可以根据特定的系统引导过滤讯息。要列出所有可用引导,请运行
# 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,其后是特定引导的限制时间戳。
显示当前引导中的所有讯息:
# journalctl -b
如果需要查看来自前一引导的日记讯息,请加一个偏移参数。下面的示例将输出前一引导的讯息:
# journalctl -b -1
另一种方法是根据引导 ID 列出引导讯息。要实现此目的,请使用 _BOOT_ID 字段:
# journalctl _BOOT_ID=156019a44a774a0bb0148a92df4af81b
15.3.2 根据时间间隔过滤 #
您可通过指定开始日期和/或结束日期来过滤 journalctl
的输出。日期规范应采用类似于“2014-06-30 9:17:16”的格式。如果省略时间部分,则会假设为午夜。如果省略秒,则会假设为“:00”。如果省略日期部分,则会假设为当日。您也可以不采用数字表示,而是指定关键字“yesterday”、“today”或“tomorrow”。它们表示当日前一天、当日或者当日后一天的午夜。如果指定“now”,则表示当前时间。您还可以指定以 -
或 +
为前缀的相对时间,分别表示当前时间之前或之后的特定时间。
仅显示从现在开始生成的新讯息,并持续更新输出:
# journalctl --since "now" -f
显示从昨天午夜到 3:20AM 的所有讯息:
# journalctl --since "today" --until "3:20"
15.3.3 根据字段过滤 #
您可以按特定的字段过滤日记输出。要匹配的字段语法为 FIELD_NAME=MATCHED_VALUE
,例如 _SYSTEMD_UNIT=httpd.service
。您可以在单个查询中指定多个匹配条件,以进一步过滤输出讯息。有关默认字段的列表,请参见 man 7 systemd.journal-fields
。
显示特定进程 ID 生成的讯息:
# journalctl _PID=1039
显示属于特定用户 ID 的讯息:
# journalctl _UID=1000
显示来自内核环缓冲区的讯息(与 dmesg
的生成结果相同):
# journalctl _TRANSPORT=kernel
显示来自服务的标准输出或错误输出的讯息:
# journalctl _TRANSPORT=stdout
仅显示指定服务生成的讯息:
# journalctl _SYSTEMD_UNIT=avahi-daemon.service
如果指定了两个不同的字段,则仅显示同时与两个表达式匹配的项:
# journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1488
如果两个匹配条件引用了相同的字段,则显示与两个表达式中任意一个匹配的所有项:
# journalctl _SYSTEMD_UNIT=avahi-daemon.service _SYSTEMD_UNIT=dbus.service
您可以使用“+”分隔符将两个表达式组合成一个逻辑“OR”。以下示例将显示来自进程 ID 为 1480 的 Avahi 服务进程的所有讯息,以及来自 D-Bus 服务的所有讯息:
# journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1480 + _SYSTEMD_UNIT=dbus.service
15.4 调查 systemd
错误 #
本节将介绍一个简单的示例,演示如何找出并修复在 apache2
启动期间 systemd
报告的错误。
尝试启动 apache2 服务:
# systemctl start apache2 Job for apache2.service failed. See 'systemctl status apache2' and 'journalctl -xn' for details.
我们来看看该服务的状态如何:
# 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。
显示与进程 ID 11026 相关的详细讯息:
# 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 [...]
修复
/etc/apache2/default-server.conf
中的拼写错误,启动 apache2 服务,然后列显其状态:# 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 [...]
15.5 Journald 配置 #
通过修改 /etc/systemd/journald.conf
可调整 systemd-journald 服务的行为。本节只介绍了基本的选项设置。有关完整的文件描述,请参见 man 5 journald.conf
。请注意,要使更改生效,需要使用以下命令重启动日记
# systemctl restart systemd-journald
15.5.1 更改日记大小限制 #
如果将日记日志数据保存到永久位置(参见第 15.1 节 “将日记设为永久”),这些数据最多会占用 /var/log/journal
所在文件系统空间的 10%。例如,如果 /var/log/journal
位于一个 30 GB /var
的分区中,则日记最多会占用 3 GB 磁盘空间。要更改此限制,请更改(并取消注释)SystemMaxUse
选项:
SystemMaxUse=50M
15.5.2 将日记转发到 /dev/ttyX
#
您可以将日记转发到终端设备,以便在首选的终端屏幕(例如 /dev/tty12
)上了解相关的系统讯息。将以下 journald 选项更改为
ForwardToConsole=yes TTYPath=/dev/tty12
15.5.3 将日记转发到 Syslog 工具 #
Journald 与传统的 syslog 实施(例如 rsyslog
)向后兼容。请确保满足以下条件:
已安装 rsyslog。
# rpm -q rsyslog rsyslog-7.4.8-2.16.x86_64
已启用 rsyslog 服务。
# systemctl is-enabled rsyslog enabled
已在
/etc/systemd/journald.conf
中启用转发到 syslog 设置。ForwardToSyslog=yes
15.6 使用 YaST 过滤 systemd
日记 #
过滤 systemd 日记的简单方法(无需处理 journalctl 语法)是使用 YaST 日记模块。使用 sudo zypper in yast2-journal
安装该模块后,请在 YaST 中选择 › 启动该模块。也可以在命令行中输入 sudo yast2 journal
来启动该模块。
模块将在表中显示日志项。使用顶部的搜索框可以搜索包含特定字符的项,这类似于使用 grep
。要按日期和时间、单位、文件或优先级过滤项,请单击 ,然后设置相应的选项。