网站搜索

使用 Journalctl 管理 Systemd 下的日志消息 [综合指南]


Systemd 是 Linux 系统的尖端系统和服务管理器:一个 init 守护进程替代品,旨在在系统启动时并行启动进程。目前许多主流发行版都支持它,包括 Fedora、Debian、Ubuntu、OpenSuSE、Arch、RHEL、CentOS 等。

之前,我们解释了“init”和“systemd”背后的故事;我们讨论了这两个守护进程是什么、为什么“init”在技术上需要替换为“systemd”以及 systemd 的主要功能。

与其他常见 init 系统相比,systemd 的主要优点之一是支持使用日志集中管理系统和进程日志记录。在本文中,我们将学习如何在 Linux 中使用 journalctl 命令在 systemd 下管理和查看日志消息。

重要:在进一步阅读本指南之前,您可能想了解如何使用“Systemctl”命令管理“Systemd”服务和单元,以及如何创建和运行新的服务和单元Linux 中使用 shell 脚本的 systemd 中的服务单元。但是,如果您对以上所有内容都满意,请继续阅读。

配置 Journald 以收集 Systemd 下的日志消息

journald 是一个守护进程,它从整个系统收集并写入日志条目;这些本质上是启动消息、来自内核和系统日志或各种应用程序的消息,它将所有消息存储在一个中央位置——日志文件中。

您可以通过编译时生成的默认配置文件/etc/systemd/journald.conf来控制journald的行为。该文件包含一些选项,您可以更改其值以适应您的本地环境要求。

下面是使用 cat 命令查看的文件示例。

cat /etc/systemd/journald.conf 
See journald.conf(5) for details.

[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitInterval=30s
#RateLimitBurst=1000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg

请注意,各种软件包安装和使用配置摘录位于 /usr/lib/systemd/*.conf.d/ 中,运行时配置可在 /run/systemd/journald.conf 中找到。 d/*.conf 您不一定会使用它。

在磁盘上启用日志数据存储

默认情况下,包括 Ubuntu 及其衍生品(例如 Linux Mint)在内的许多 Linux 发行版都不会在磁盘上启用启动消息的持久存储。

可以通过将“存储”选项设置为“持久”来启用此功能,如下所示。这将创建 /var/log/journal 目录,所有日志文件都将存储在该目录下。

sudo vi /etc/systemd/journald.conf 
OR
sudo nano /etc/systemd/journald.conf 
[Journal]
Storage=persistent

对于其他设置,请通过键入来查找应在“[Journal]”部分下配置的所有选项的含义。

man journald.conf

使用 Timedatectl 命令设置正确的系统时间

为了在 systemd 下使用日志服务进行可靠的日志管理,请确保系统上的时间设置(包括时区)正确。

要查看系统上的当前日期和时间设置,请键入。

timedatectl 
OR
timedatectl status

Local time: Thu 2017-06-15 13:29:09 EAT
Universal time: Thu 2017-06-15 10:29:09 UTC
RTC time: Thu 2017-06-15 10:29:09
Time zone: Africa/Kampala (EAT, +0300)
Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no

要设置正确的时区和可能的系统时间,请使用以下命令。

sudo timedatectl set-timezone  Africa/Kampala
sudo timedatectl set-time “13:50:00”

使用 Journalctl 命令查看日志消息

journalctl是一个用于查看systemd日志内容的实用程序(由journald服务编写)。

要显示所有收集的日志而不进行任何过滤,请键入。

journalctl
-- Logs begin at Wed 2017-06-14 21:56:43 EAT, end at Thu 2017-06-15 12:28:19 EAT
Jun 14 21:56:43 tecmint systemd-journald[336]: Runtime journal (/run/log/journal
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuset
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpu
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuacct
Jun 14 21:56:43 tecmint kernel: Linux version 4.4.0-21-generic (buildd@lgw01-21)
Jun 14 21:56:43 tecmint kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-
Jun 14 21:56:43 tecmint kernel: KERNEL supported cpus:
Jun 14 21:56:43 tecmint kernel:   Intel GenuineIntel
Jun 14 21:56:43 tecmint kernel:   AMD AuthenticAMD
Jun 14 21:56:43 tecmint kernel:   Centaur CentaurHauls
Jun 14 21:56:43 tecmint kernel: x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x01: 'x87 flo
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x02: 'SSE reg
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x04: 'AVX reg
Jun 14 21:56:43 tecmint kernel: x86/fpu: Enabled xstate features 0x7, context si
Jun 14 21:56:43 tecmint kernel: x86/fpu: Using 'eager' FPU context switches.
Jun 14 21:56:43 tecmint kernel: e820: BIOS-provided physical RAM map:
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000000000-0x00000000000
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000090000-0x00000000000
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000100000-0x000000001ff
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020000000-0x00000000201
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020200000-0x00000000400

查看基于引导的日志消息

您可以使用 --list-boots 选项显示启动号列表(相对于当前启动)、它们的 ID 以及与启动对应的第一条和最后一条消息的时间戳。

journalctl --list-boots

-1 9fb590b48e1242f58c2579defdbbddc9 Thu 2017-06-15 16:43:36 EAT—Thu 2017-06-15 1
 0 464ae35c6e264a4ca087949936be434a Thu 2017-06-15 16:47:36 EAT—Thu 2017-06-15 1 

要查看当前启动(编号 0)的日志条目,请使用 -b 开关,如下所示(与上面的示例输出相同)。

journalctl -b

要查看上次启动的日志,请使用 -1 相对指针和 -b 选项,如下所示。

journalctl -b -1

或者,也可以像这样使用引导 ID。

journalctl -b 9fb590b48e1242f58c2579defdbbddc9

根据时间过滤日志消息

要使用协调世界时 (UTC) 格式的时间,请添加 --utc 选项,如下所示。

journalctl --utc

查看自特定日期和时间以来的所有条目,例如2017 年 6 月 15 日上午 8:15,键入此命令。

journalctl --since "2017-06-15 08:15:00"
journalctl --since today
journalctl --since yesterday

查看最近的日志消息

要查看最近的日志消息(默认情况下为 10 条),请使用 -n 标志,如下所示。

journalctl -n
journalctl -n 20 

查看内核生成的日志消息

要仅查看内核消息,类似于 dmesg 命令输出,您可以使用 -k 标志。

journalctl -k 
journalctl -k -b 
journalctl -k -b 9fb590b48e1242f58c2579defdbbddc9

查看设备生成的日志消息

要查看特定单元的所有日记条目,请使用 -u 开关,如下所示。

journalctl -u apache2.service

要将当前启动值清零,请键入此命令。

journalctl -b -u apache2.service

要显示上次启动的日志,请使用它。

journalctl -b -1 -u apache2.service

以下是一些其他有用的命令:

journalctl -u apache2.service  
journalctl -u apache2.service --since today
journalctl -u apache2.service -u nagios.service --since yesterday

查看进程生成的日志消息

要查看特定进程生成的日志,请指定它的 PID,如下所示。

journalctl _PID=19487
journalctl _PID=19487 --since today
journalctl _PID=19487 --since yesterday

查看由用户或组 ID 生成的日志消息

要查看特定用户或组生成的日志,请指定其用户或组 ID,如下所示。

journalctl _UID=1000
journalctl _UID=1000 --since today
journalctl _UID=1000 -b -1 --since today

查看文件生成的日志

要显示文件(可能是可执行文件)(例如 D-Bus 可执行文件或 bash 可执行文件)生成的所有日志,只需键入。

journalctl /usr/bin/dbus-daemon
journalctl /usr/bin/bash

按优先级查看日志消息

您还可以使用 -p 标志根据消息优先级或优先级范围过滤输出。可能的值为:0 – 紧急、1 – 警报、2 – 暴击、3 – 错误、4 – 警告、5 – 通知、6 – 信息、7 – 调试):

journalctl -p err

要指定范围,请使用以下格式(紧急情况到警告)。

journalctl -p 1..4
OR
journalctl -p emerg..warning

实时查看日志消息

您实际上可以在使用 -f 选项写入日志时查看日志(类似于 tail -f 功能)。

journalctl -f

处理日志显示格式

如果要控制日记条目的输出格式,请添加 -o 标志并使用以下选项:cat、export、json、json-pretty、json-sse、short、short-iso、短单调、短精确和冗长(检查手册页中选项的含义:

cat 选项显示每个日记条目的实际消息,没有任何元数据(时间戳等)。

journalctl -b -u apache2.service -o cat

管理系统上的期刊

要检查日志文件的内部一致性,请使用 --verify 选项。如果一切顺利,输出应指示 PASS。

journalctl --verify

PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system.journal                               
491f68: Unused data (entry_offset==0)                                                                
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000003184-000551f9866c3d4d.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000001fc8-000551f5d8945a9e.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000d4f-000551f1becab02f.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000001-000551f01cfcedff.journal

删除旧日志文件

您还可以使用 --disk-usage 选项显示所有日志文件的当前磁盘使用情况。它显示所有已归档和活动日志文件的磁盘使用量总和:

journalctl --disk-usage

要删除旧的(存档的)日志文件,请运行以下命令:

sudo journalctl --vacuum-size=50M  #delete files until the disk space they use falls below the specified size
sudo journalctl --vacuum-time=1years	#delete files so that all journal files contain no data older than the specified timespan
sudo journalctl --vacuum-files=4     #delete files so that no more than the specified number of separate journal files remain in storage location

轮换日志文件

最后但并非最不重要的一点是,您可以使用--rotate选项指示journald旋转日志文件。请注意,该指令在旋转操作完成之前不会返回:

sudo journalctl --rotate

有关深入的使用指南和选项,请查看 Journalctl 手册页,如下所示。

man journalctl

请查看一些有用的文章。

  1. 管理系统启动流程和服务(SysVinit、Systemd 和 Upstart)
  2. Petiti – 适用于 Linux 系统管理员的开源日志分析工具
  3. 如何在 Linux 中使用 Logrotate 设置和管理日志轮转
  4. lnav – 从 Linux 终端观察和分析 Apache 日志

现在就这样。使用下面的反馈来提出任何问题或添加您对此主题的想法。