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,助力问题定位的主要内容,如果未能解决你的问题,请参考以下文章