使用 Journalctl 管理 Systemd 下的日志消息 [综合指南]
Systemd是 Linux 系统的尖端系统和服务管理器:一个 init 守护进程替代品,旨在在系统启动时并行启动进程。它现在在许多当前主流发行版中都受支持,包括 Fedora、Debian、Ubuntu、OpenSuSE、Arch、RHEL、CentOS 等。
之前,我们解释了“init”和“systemd”背后的故事;我们讨论了这两个守护进程是什么,为什么“ init ”在技术上需要被“ systemd ”取代,以及systemd的主要特性。
systemd 相对于其他常见 init 系统的主要优势之一是支持使用日志集中管理系统和进程日志。在本文中,我们将学习如何在 Linux 中使用journalctl命令管理和查看 systemd 下的日志消息。
重要提示:在继续阅读本指南之前,您可能希望了解如何使用“Systemctl”命令管理“Systemd”服务和单元,以及如何使用 Linux 中的 shell 脚本在 systemd 中创建和运行新的服务单元。但是,如果您对以上所有内容都满意,请继续阅读。
配置 Journald 以在 Systemd 下收集日志消息
journald是一个守护进程,它从整个系统收集和写入日记条目;这些基本上是启动消息、来自内核和系统日志或各种应用程序的消息,它将所有消息存储在一个中心位置 - 日志文件。
您可以通过其默认配置文件控制journald的行为: /etc/systemd/journald.conf,该文件在编译时生成。此文件包含一些选项,您可以更改这些选项的值以适合您的本地环境要求。
下面是使用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中找到,但您可能不一定会使用它们。
启用磁盘上的日志数据存储
许多 Linux 发行版(包括 Ubuntu 及其衍生产品(如 Linux Mint))默认不允许在磁盘上持久存储启动消息。
可以通过将“存储”选项设置为“持久”来启用此功能,如下所示。这将创建/var/log/journal目录,所有日志文件都将存储在该目录下。
$ sudo vi /etc/systemd/journald.conf OR $ sudo nano /etc/systemd/journald.conf
[Journal] Storage=persistent
对于其他设置,请通过键入内容来查找在“[Journal]”部分下配置的所有选项的含义。
$ man journald.conf
使用 Timedatectl 命令设置正确的系统时间
为了使用 journald 服务在 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 example systemd-journald[336]: Runtime journal (/run/log/journal Jun 14 21:56:43 example kernel: Initializing cgroup subsys cpuset Jun 14 21:56:43 example kernel: Initializing cgroup subsys cpu Jun 14 21:56:43 example kernel: Initializing cgroup subsys cpuacct Jun 14 21:56:43 example kernel: Linux version 4.4.0-21-generic (buildd@lgw01-21) Jun 14 21:56:43 example kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21- Jun 14 21:56:43 example kernel: KERNEL supported cpus: Jun 14 21:56:43 example kernel: Intel GenuineIntel Jun 14 21:56:43 example kernel: AMD AuthenticAMD Jun 14 21:56:43 example kernel: Centaur CentaurHauls Jun 14 21:56:43 example kernel: x86/fpu: xstate_offset[2]: 576, xstate_sizes[2] Jun 14 21:56:43 example kernel: x86/fpu: Supporting XSAVE feature 0x01: 'x87 flo Jun 14 21:56:43 example kernel: x86/fpu: Supporting XSAVE feature 0x02: 'SSE reg Jun 14 21:56:43 example kernel: x86/fpu: Supporting XSAVE feature 0x04: 'AVX reg Jun 14 21:56:43 example kernel: x86/fpu: Enabled xstate features 0x7, context si Jun 14 21:56:43 example kernel: x86/fpu: Using 'eager' FPU context switches. Jun 14 21:56:43 example kernel: e820: BIOS-provided physical RAM map: Jun 14 21:56:43 example kernel: BIOS-e820: [mem 0x0000000000000000-0x00000000000 Jun 14 21:56:43 example kernel: BIOS-e820: [mem 0x0000000000090000-0x00000000000 Jun 14 21:56:43 example kernel: BIOS-e820: [mem 0x0000000000100000-0x000000001ff Jun 14 21:56:43 example kernel: BIOS-e820: [mem 0x0000000020000000-0x00000000201 Jun 14 21:56:43 example kernel: BIOS-e820: [mem 0x0000000020200000-0x00000000400
根据启动查看日志信息
您可以使用此选项显示启动编号列表(相对于当前启动)、它们的 ID 以及与启动相对应的第一条和最后一条消息的时间戳--list-boots
。
$ 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 – emerg、1 – alert、2 – crit、3 – err、4 – warning、5 – notice、6 – info、7 – debug):
$ journalctl -p err
要指定范围,请使用以下格式(emerg 到 warning)。
$ 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、short-monotonic、short-precise 和 verbose(检查手册页中选项的含义:
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
轮换日志文件
最后但同样重要的是,你可以使用选项指示 journald 轮换日志文件--rotate
。请注意,此指令在轮换操作完成之前不会返回:
$ sudo journalctl --rotate
有关深入的使用指南和选项,请查看如下的 journalctl 手册页。
$ man journalctl
请查看一些有用的文章。
- 管理系统启动过程和服务(SysVinit、Systemd 和 Upstart)
- Petiti – 面向 Linux 系统管理员的开源日志分析工具
- 如何在 Linux 中使用 Logrotate 设置和管理日志轮换
- lnav - 从 Linux 终端查看和分析 Apache 日志
现在就是这样。使用下面的反馈来提出任何问题或添加您对这个主题的想法。