介绍
许多人说 Systemd 不好,它对系统很繁重,而且一直是一个有争议的话题。但你不能否认它提供了一套很好的实用程序来管理和排除系统故障。想象一下,您最终会得到一个没有 GUI 的损坏系统。您可能也搞砸了 boot 和 GRUB。在这种情况下或一般情况下——您可以从 LIVE 系统启动,挂载您的 Linux 分区并浏览 Systemd 日志以找出问题所在。
Systemd 具有以下三个基本组件:
- systemd:Linux 操作系统的系统和服务管理器。
- systemctl:用于自省和控制 systemd 系统和服务管理器状态的命令。
- systemd-analyze:提供系统启动性能统计信息,并从系统和服务管理器检索其他状态和跟踪信息
除了这三个之外,systemd 还提供了其他服务,例如 – journald、logind、networkd 等。在本指南中,我们将讨论 systemd 的 journald 服务。
journald – systemd journal守护进程
通过设计,systemd 提供了一种集中方式来处理来自进程、应用程序等的所有操作系统日志。所有这些日志记录事件都由 systemd 的 journald 守护进程处理。journald 守护进程收集来自 Linux 操作系统各处的所有日志,并将主题作为二进制数据存储在文件中。
集中记录事件的优点,作为二进制数据的系统问题有很多。例如,由于系统日志存储为二进制而不是文本 – 您可以通过多种方式进行翻译,例如文本、JSON 对象以满足各种需求。此外,由于日志是通过日志的日期/时间操作顺序存储的,因此跟踪单个事件非常容易。
请记住,journald 收集的日志文件有数千行,并且会针对每个事件、每次启动进行更新。因此,如果您长时间运行 Linux 操作系统,journal日志大小应该以 GB 为单位。由于日志数以千计,因此最好使用基本命令进行过滤以了解有关系统问题的更多信息。
journald配置文件
journald 的配置文件位于以下路径中。它包含有关日志记录如何发生的各种标志。您可以查看该文件并进行必要的更改。但我建议不要修改此文件,除非您知道自己在做什么。
/etc/systemd/journald.conf
journald 存储二进制日志文件的位置
journald 以二进制格式存储日志。它们存储在此路径下的目录中。
[linuxmi@fedora www.linuxmi.com]$ cd /var/log/journal
[linuxmi@fedora journal]$ ls
a73fa995d8e4438ea7b1fcedb8220981
[linuxmi@fedora journal]$ cd a73fa995d8e4438ea7b1fcedb8220981
例如,在下面的路径中有一个目录,其中包含迄今为止的所有系统日志。
journalctl 日志文件路径
不要使用 cat 命令或使用 nano 或 vi 打开这些文件。它们将无法正确显示。
使用 journalctl 查看和分析 Systemd 日志
基本journalctl命令
使用journalctl守护程序查看日志的基本命令是 :
[linuxmi@fedora www.linuxmi.com]$ journalctl
journalctl
这将为您提供所有日志条目,包括来自所有应用程序和进程的错误、警告等。它显示最旧日志在顶部和当前日志在底部的列表。您需要按住 ENTER 逐行滚动。您也可以使用 PAGE UP 和 PAGE DOWN 键滚动。按 q 退出此视图。
如何查看时区的 journal条目
默认情况下,journalctl 显示当前系统时区的日志时间。但是,您可以轻松地在命令中提供时区以将相同的日志转换为不同的时区。例如,要以 UTC 格式查看日志,请使用以下命令。
[linuxmi@fedora www.linuxmi.com]$ journalctl --utc
journalctl –utc
如何在journal日志中仅查看错误、警告等
系统生成的日志具有不同的优先级。有些日志可能是可以忽略的警告,有些可能是严重错误。您可能只想查看错误,而不是警告。这也可以使用以下命令。
要查看紧急系统消息,请使用:
[linuxmi@fedora www.linuxmi.com]$ journalctl -p 0
journalctl -p 0
错误代码
0:紧急
1:警报
2:严重
3:错误
4:警告
5:通知
6:信息
7:调试
当您指定错误代码时,它会显示来自该代码及以上代码的所有消息。例如,如果您指定以下命令,它将显示优先级为 2、1 和 0 的所有消息
[linuxmi@fedora www.linuxmi.com]$ journalctl -p 2
如何查看特定引导的 journal日志
当您运行 journalctl 命令时,它会显示来自当前启动的信息,这些信息来自您正在运行的当前会话。但也可以查看有关过去引导的信息。
journal 日志会在每次重新启动时不断更新。journald 跟踪不同引导中的日志。要查看,引导日志使用以下命令。
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl --list-boots
journalctl 列表引导
- 第一个数字显示了唯一的日志引导轨道编号,您可以在下一个命令中使用它来分析特定的引导。
- 第二个数字是您也可以在命令中指定的引导 ID。
- 接下来的两个日期、时间组合是存储在相应文件中的日志的持续时间。如果您想从特定日期、时间找出日志或错误,这非常方便。
要查看特定的引导编号,请使用第一个编号或引导 ID,如下所示。
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl -b -2
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl -b ff83b9f3b8cb462abf6f0c318c86f4a2
journalctl -b 2
您还可以使用-x开关来在显示中添加对 systemd 错误消息的解释。在某些情况下,这是救命稻草。
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl -xb -p 3
journalctl -xb
如何查看特定时间、日期持续时间的 journal 日志
journalctl 足够强大,可以在命令本身中提供类似“english”的参数来进行时间和日期操作。
您可以将 –since 开关与“yesterday”, “today”, “tomorrow”, 或 “now”组合使用。
下面是不同命令的一些示例。您可以根据需要修改它们。一看就知道,以下命令中的日期、时间格式为”YYYY-MM-DD HH:MM:SS”
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl --since "2022-01-16 06:00:00"
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl --since "2022-03-03" --until "2022-03-05 05:00:00"
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl --since yesterday
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl --since 08:00 --until "1 hour ago"
您也可以将上述内容与错误级别开关结合使用。
如何查看内核特定的journal 日志
Linux 内核消息也可以从 journal 日志中提取。要查看当前启动的内核消息,请仅使用以下命令。
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl -k
如何查看服务的 journal 日志,PID
您只能从 journald 日志中过滤掉来自 systemd 服务单元的特定日志。例如,要从 NetworkManager 服务中查找日志,请使用以下命令。
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl -u NetworkManager.service
journalctl NetworkManager 服务
如果您不知道服务名称,可以使用以下命令列出系统中的 systemd 服务。
linuxmi@linuxmi:~/www.linuxmi.com$ systemctl list-units --type=service
如何查看用户、组的 journal 日志
如果您正在分析服务器日志,则此命令在多个用户登录时很有帮助。您可以首先使用以下命令从用户名中找出用户 ID。例如,要找出用户“ linuxmi”的 id
linuxmi@linuxmi:~/www.linuxmi.com$ id -u linuxmi
然后使用该 ID 和_UID来查看用户生成的日志。
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl _UID=1000 --since today
journalctl _UID
同样,使用_GID为用户组找出相同的值。
如何查看可执行文件的 journal 日志
您还可以查找特定程序或可执行文件的 journald记录。例如,如果要查找 gnome-shell 的消息,可以运行以下命令。
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl /usr/bin/gnome-shell --since today
journalctl gnome-shell
结束语
我希望本指南可以帮助您使用 journalctl 在 Linux 桌面或服务器故障排除上查看分析 systemd 日志。如果您知道如何使用命令,systemd 日志管理功能非常强大,它可以让您在调试期间轻松一些。如今,所有主要的主流 Linux 发行版都使用 Systemd。Ubuntu、Debian、Fedora、Arch——它们都使用 systemd 作为默认操作系统产品。如果您想了解无 systemd 的 Linux 发行版,那你可能需要查看MX-Linux、Gentoo、Slackware、Void Linux。