systemd的统一日志记录系统journalctl,助力问题定位

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了systemd的统一日志记录系统journalctl,助力问题定位相关的知识,希望对你有一定的参考价值。

参考技术A systemd程序是进程ID为1的进程,负责以所需的方式初始化系统。 systemd由内核直接启动,信号 9(该信号通常会终止进程)对它不起作用 。systemd统一管理所有 Unit 的启动日志,好处是仅用journalctl一个命令,查看所有日志(内核日志和应用日志)。

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

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

# journalctl _PID=1039

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

# journalctl _UID=1000

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

# 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

默认情况下,日记在 /run/log/journal/ 中储存日志数据。由于 /run/ 目录具有易失本性,因此, 在重引导时会丢失日志数据 。要永久保存日志数据,/var/log/journal/ 目录必须存在且具有正确的所有权和权限,如此,systemd-journald 服务便可在其中储存其数据。

以 root 身份编辑journald.conf。

# vi /etc/systemd/journald.conf

将包含Storage= 的行取消注释,并更改为

[...]

[Journal]

Storage=persistent

#Compress=yes

[...]

保存该文件,然后重启 systemd-journald:

systemctl restart systemd-journald

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

SystemMaxUse=50M

举例:如何找出并修复在 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 [...]

journalctl:查询systemd日记

以上是关于systemd的统一日志记录系统journalctl,助力问题定位的主要内容,如果未能解决你的问题,请参考以下文章

week 9

Linux 基础知识

systemd相关

Systemd-journalctl日志管理

systemd的日志管理进程journald

关于Journal Log