如何使用 journalctl 读取 Linux 系统日志

Linux 系统日志随着 systemd
的引入而改变。了解如何使用 journalctl
命令读取和过滤系统日志消息。
集中记录
systemd
系统和服务管理器对系统日志的收集方式进行了重大更改,这对争议并不陌生。根据创建它们的服务或守护进程,日志过去位于文件系统中的不同位置。但他们都有一个共同点。它们是纯文本文件。
使用 systemd
,所有系统、引导和内核日志文件都由中央专用日志记录解决方案收集和管理。它们存储的格式是二进制格式。这有助于提取不同格式的数据,例如我们将看到的 JSON。
它还可以更容易地交叉引用以前记录在单独日志文件中的相关信息。因为数据现在保存在一个日志中,所以可以选择来自多个感兴趣来源的数据并将其显示在一个交织的条目列表中。
journalctl
是用于处理日志的工具。
journalctl 没有多余的装饰
您可以在没有命令行参数的情况下调用 journalctl
:
journalctl

journalctl
显示整个日志,最旧的条目位于列表顶部。该列表以 less
显示,允许您使用 less
的常用导航功能进行分页和搜索。您还可以使用左箭头
和右箭头
键横向滚动以阅读宽日志条目。

按 End
键将直接跳到列表底部和最新的日志条目。

按 Ctrl+C
退出。
尽管可以在不使用 sudo
的情况下调用 journalctl
,但如果您使用 sudo
,您将确保看到日志中的所有详细信息。
sudo journalctl

如果需要,您可以使用 --no-pager
使 journalctl
将其输出发送到终端窗口而不是 less
选项。
sudo journalctl --no-pager

输出在终端窗口中快速滚动,然后您将返回到命令提示符。

要限制 journalctl
返回的行数,请使用 -n
(行数)选项。让我们要求十行输出:
sudo journalctl -n 10

关注期刊更新
要使 journalctl
在日志中显示最新的条目,请使用 -f
(跟随)选项。
sudo journalctl -f


最新条目的时间戳为 07:09:07。随着新活动的发生,新条目将附加到显示的底部。近乎实时的更新——太棒了!

在 07:09:59,一个名为 geek-app
的应用程序向日志中注入了一条日志条目,上面写着“来自 HTG 的新消息”。
更改显示格式
因为日志是二进制文件,所以其中的数据需要翻译或解析成文本才能显示给您。使用不同的解析器,可以从相同的二进制源数据创建不同的输出格式。 journalctl
可以使用几种不同的格式。
默认输出是短格式,这与经典的系统日志格式非常相似。要显式请求短格式,请使用带有 short
修饰符的 -o
(输出)选项。
sudo journalctl -n 10 -o short-full

从左到右,字段是:
- 消息的创建时间,以当地时间表示。
- 主机名。
- 进程名称。这是生成消息的过程。
- 日志消息。
要获得完整的日期和时间戳,请使用 short-full
修饰符:
sudo journalctl -n 10 -o short-full

此输出中的日期和时间格式是您在按时间段选择日志消息时需要提供日期和时间的格式,我们很快就会看到。
要查看每条日志消息附带的所有元数据,请使用 verbose
修饰符。
sudo journalctl -n 10 -o verbose

可能的字段有很多,但所有字段都出现在一条消息中的情况很少见。

一个值得讨论的字段是 Priority
字段。在此示例中,它的值为 6。该值表示消息的重要性:
- 0:紧急情况。系统无法使用。
- 1:警报。已标记应立即纠正的情况。
- 2:严重。这包括主要应用程序中的崩溃、核心转储和重大故障。
- 3:错误。已报告一个错误,但并不严重。
- 4:警告。引起您的注意,如果忽略该条件,可能会导致错误。
- 5:通知。用于报告异常事件,但不报告错误。
- 6:信息。定期操作消息。这些不需要采取行动。
- 7:调试。将消息放入应用程序中,使他们更容易调试它们。
如果您希望输出显示为格式正确的 JavaScript 对象表示法 (JSON) 对象,请使用 json
修饰符:
sudo journalctl -n 10 -o json

每条消息都被正确包装为格式正确的 JSON 对象,并且每行输出显示一条消息。
要漂亮地打印 JSON 输出,请使用 json-pretty
修饰符。
sudo journalctl -n 10 -o json-pretty

每个 JSON 对象都被拆分成多行,每个名称-值对都在一个新行上。

要仅查看没有时间戳或其他元数据的日志条目消息,请使用 cat
修饰符:
sudo journalctl -n 10 -o cat

这种显示格式使得很难识别哪个进程引发了日志事件,尽管有些消息确实包含线索。

按时间段选择日志消息
要将 journalctl
的输出限制为您感兴趣的时间段,请使用 -S
(自)和 -U
(直到)选项。
要查看自特定时间和日期以来的日志条目,请使用以下命令:
sudo journalctl -S "2020-91-12 07:00:00"

显示仅包含在命令中的日期和时间之后到达的消息。

要定义您希望报告的时间段,请同时使用 -S
(自)和 -U
(直到)选项。此命令查看 15 分钟时间段内的日志消息:
sudo journalctl -S "2020-91-12 07:00:00" -U "2020-91-12 07:15:00"

如果您知道您的系统上发生了一些奇怪的事情,并且大致知道它发生的时间,那么这是一个很好的组合使用。

使用相对时间段
选择时间段时可以使用相对寻址。这意味着您可以说“显示从一天前到现在的所有事件”之类的话。这就是这个命令的意思。 “d”代表“天”,“-1”代表过去的一天。
sudo journalctl -S -1d

日志消息从昨天的 00:00:00 开始列出,直到“现在”。

如果您想调查最近发生的事情,您可以指定一个以小时为单位的相对时间段。我们在这里查看过去一小时的日志消息:
sudo journalctl -S -1h

为您显示过去一小时的消息。您还可以使用“m”来设置以分钟为单位的相对时间段,“w”为周。

journalctl
理解今天
、昨天
和明天
。这些修饰符提供了一种指定常用时间段的简便方法。要查看昨天发生的所有事件,请使用以下命令:
sudo journalctl -S yesterday

检索并显示昨天发生的所有日志事件,直到午夜 00:00:00。

要查看目前为止今天收到的所有日志消息,请使用以下命令:
sudo journalctl -S today

显示从 00:00:00 到发出命令时的所有内容。

您可以混合使用不同的时间段修改器。要查看从两天前到今天开始的所有内容,请使用以下命令:
sudo journalctl -S -2d -U today

检索并显示从前天到今天的所有内容。

按数据字段选择日志消息
您可以搜索与各种日志字段匹配的日志消息。这些搜索尝试在附加到每条消息的元数据中找到匹配项。建议您参考字段列表并选择对您最有用的字段。
请记住,应用程序是否完成每个字段完全取决于应用程序的作者。您不能保证每个字段都会被填充。
所有的期刊字段修饰符都以相同的方式使用。我们将在下面的示例中使用一些。要查找来自特定应用程序的日志消息,请使用 _COMM
(命令)修饰符。如果您还使用 -f
(跟随)选项,journalctl
将在新消息到达时跟踪来自该应用程序的新消息。
sudo journalctl -f _COMM=geek-app

您可以使用生成日志消息的进程的进程 ID 搜索日志条目。使用 ps
命令查找您要搜索的守护进程或应用程序的进程 ID。
sudo journalctl _PID=751

在用于研究本文的机器上,SSH 守护进程是进程 751。

您也可以按用户 ID 搜索。这是启动应用程序或命令或拥有进程的人的用户 ID。
sudo journalctl _UID=1000

与任何其他用户 ID 关联的所有消息都被过滤掉。仅显示与用户 1000 相关的消息:

另一种搜索与特定应用程序相关的日志消息的方法是提供可执行文件的路径。
sudo journalctl /usr/bin/anacron

检索并显示所有 anacron
调度程序日志消息。

为了使搜索更容易,我们可以要求 journalctl
列出它拥有的所有值,对于任何期刊字段。
要查看 journalctl
为其记录日志消息的用户 ID,请使用 -F
(字段)选项,并传递 _UID
字段标识符。
journalctl -F _UID

让我们再做一次并查看组 ID (GID):
journalctl -F _GID

您可以使用任何日记帐字段标识符来执行此操作。
列出内核消息
有一种内置的方法可以快速隔离内核消息。您不需要自己搜索和隔离它们。 -k
(内核)选项删除所有其他消息并让您即时查看内核日志条目。
sudo journalctl -k

根据 Priority
字段中的值,突出显示消息的重要性。

查看引导消息
如果您遇到与启动相关的问题并希望进行调查,journalctl
可以满足您的要求。也许您已经添加了新硬件,但它没有响应,或者在您上次系统升级后以前工作的硬件组件不再工作。
要查看与上次启动相关的日志条目,请使用 -b
(启动)选项:
journalctl -b

为您显示上次启动的日志条目。

当我们说“上次启动”时,我们指的是使您的计算机在当前登录会话中恢复活力的启动过程。要查看以前的启动,您可以使用数字告诉 journalctl
您对哪个启动感兴趣。要查看第三次先前的启动,请使用此命令:
journalctl -b 3

通常,如果您遇到问题并且不得不重新启动您的机器,这是您感兴趣的先前启动顺序。所以这是一个常见的命令形式。

很容易与靴子的顺序混淆。为了提供帮助,我们可以要求 journalctl
使用 --list-boots
选项列出它在日志中记录的靴子。
journalctl --list-boots

您可以根据日期和时间戳确定您希望查看消息的引导,然后使用左侧列中的数字获取该引导序列的日志消息。您还可以选择 32 位启动标识符,并将其传递给 journalctl
。
sudo journalctl -b 1f00248226ed4ab9a1abac86e0d540d7

检索并显示我们请求的引导序列中的日志消息。

管理日志硬盘空间
当然,日志及其所有日志消息都存储在您的硬盘上。这意味着它们将占用硬盘空间。要查看日志占用了多少空间,请使用 --disk-usage
选项。
journalctl --disk-usage

对于今天的硬盘驱动器,152 MB 的空间根本不算多,但出于演示目的,我们仍将其缩减。我们有两种方法可以做到这一点。第一个是设置您希望日志减少到的大小限制。当然,它会再次生长,但我们现在可以修剪它,为新的生长做好准备。
我们将使用标题精美的 --vacuum-size
选项,并传入我们希望日志缩小到的大小。我们将要求 100 MB。思考这个问题的方式是我们要求 journalctl
“尽可能丢弃任何东西,但不要低于 100 MB。”
journalctl --vacuum-size=100M

另一种减少日志大小的方法是使用 --vacuum-time
选项。此选项告诉 journalctl
丢弃早于您在命令行中提供的时间段的消息。您可以在时间段中使用天
、周
、月
和年
。
让我们清除所有超过一周的消息:
journalctl --vacuum-time=1weeks

数据与信息
除非您能够获取并利用它,否则数据是没有用的。然后它就变成了有用的信息。 journalctl
命令是一个灵活而复杂的工具,可让您以多种方式获取感兴趣的信息。
您可以使用任何您必须在您需要的日志消息中找到的信息片段。
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts