使用 journalctl 命令在 Linux 中分析日志的初学者指南

系统 是大多数主要 Linux 发行版的默认设置。 systemd 的主要功能之一是它收集日志的方式以及它为分析这些日志提供的工具。

在传统 系统初始化 系统,您有 syslog 将日志存储在纯文本文件中。 读取和分析这些文件需要使用 find、grep、cut 和许多其他命令。

systemd 从比 syslogs 更多的来源收集日志,以二进制格式保存日志日志,并为您提供命令行工具来读取、分析和操作日志。 这比系统日志更精简。

什么是日记? 什么是 journalctl?

journald 是 systemd 的守护进程,它从各种日志源(如 syslog)收集日志。

journalctl 是一个命令行工具,可让您与日志日志进行交互。

使用 journalctl 可以读取日志,实时监控日志,根据时间、服务、严重性等参数过滤日志。

在本教程中,我将向您展示如何使用 journalctl 来读取、监控和分析 Linux 中的日志。

检查您的系统上是否启用了日志日志

一些 Linux 发行版,特别是桌面发行版,默认情况下不启用日志日志。

日志日志的默认位置是 /var/log/journal 目录。 您应该确保该目录存在。 如果没有,请自己创建。

接下来,在 /etc/systemd/journald.conf 文件中确保值 Storage 设置为 auto 或者 persistent.

journald.conf 文件显示默认值。 因此,即使条目前面有 #,也意味着这些是正在使用的默认设置。 如果要更改任何内容,请从该行中删除 #。

使用 journalctl 命令

让我向您展示一些 journalctl 命令最基本但最有用的示例。

使用 journalctl 阅读和搜索日志

如果你只是输入 journalctl 在终端中,它将按时间顺序显示日志日志。

journalctl

journalctl 使用 less 下面向您显示日志。 这意味着您可以使用与使用 less 命令相同的键来移动日志。

如果你不记得,这里有一个快速回忆:

钥匙描述
移动一行
空间下移一页
b上移一页
G转到第一行
G转到最后一行
100克转到第 100 行
/细绳从当前位置搜索字符串
无/无转到下一个或上一个搜索匹配
qExit 日志

如果您不希望日志以不太喜欢的查看模式显示,您可以使用 --no-pager 旗帜。 这将直接在屏幕上显示整个日志。

journalctl --no-pager

这不是很有用,如果您有大量日志,它会淹没您的屏幕。

按时间倒序显示日志

如您所见,日志按时间顺序显示。 这意味着最旧的存储日志首先显示。

如果您想首先查看最近的日志,您可以使用选项以相反的顺序显示日志日志 -r

journalctl -r

它仍然使用较少的命令,如 view。 所以,按 q 退出日志查看模式。

仅显示最近 N 行日志日志

除了显示所有日志之外,您还可以使用 -n 选项。

为了 example,下面的命令将显示最近的 25 行日志:

journalctl -n 25

实时显示日志日志

查看最近的日志是一回事,如果要实时查看日志,可以使用 -f journalctl 命令的选项:

journalctl -f

与tail命令的-f选项一样,这将在follow模式下实时显示日志。

使用 Ctrl+C 命令退出实时视图。

以 UTC 时间显示日志

默认情况下,日志日志以系统本地时间显示。 如果您的系统时间设置为 UTC 以外的时间,并且您希望以 UTC 格式查看日志,您可以使用 --utc 旗帜。

journalctl --utc

使用 -k 仅显示内核消息

systemd 日志会累积来自不同来源的日志。 如果您只想查看 Linux 内核日志,可以使用该选项 -k.

journalctl -k
journalctl 内核日志

提示:使用 sudo 查看所有日志日志

Systemd 会保护向哪个用户显示什么样的日志。

如果您是普通用户,它可能会显示一些日志,但不会显示所有日志:

[email protected]:~$ journalctl -u ssh
Hint: You are currently not seeing messages from other users and the system.
      Users in groups 'adm', 'systemd-journal' can see all messages.
      Pass -q to turn off this notice.
-- Logs begin at Mon 2020-06-22 12:05:47 UTC, end at Tue 2020-07-14 11:59:29 UTC. --
-- No entries --

如果您想访问所有日志,您应该使用 sudo 如果你是一个 sudo 用户:

sudo journalctl -u ssh

显示来自特定引导会话的消息

这是 jounrald 的一个很好的功能。 journalctl 命令允许您使用选项访问属于特定引导会话的日志 -b.

您可以列出所有启动会话 --list-boots 旗帜。

journalctl --list-boots

输出将显示引导会话以及引导时间和分配给引导会话的整数:

  -5 513008ead8464c23aab732a2feed5277 Sun 2020-07-12 20:43:38 IST—Sun 2020-07-12 22:40:02 IST
  -4 caff16e3f46a4479b5287fb9e294f610 Mon 2020-07-13 07:36:04 IST—Mon 2020-07-13 19:13:44 IST
  -3 5665f41cc50a4dec9955efacc2596d68 Mon 2020-07-13 20:30:55 IST—Mon 2020-07-13 22:20:34 IST
  -2 c7d17407b0bd476a930af503f64b6006 Tue 2020-07-14 07:58:41 IST—Tue 2020-07-14 18:50:04 IST
  -1 7ab5e04518ec455abe0e2c86fdaa46fa Tue 2020-07-14 21:19:27 IST—Tue 2020-07-14 22:42:11 IST
   0 91856e86d4ee4e828717913deb288568 Wed 2020-07-15 08:11:51 IST—Wed 2020-07-15 17:14:10 IST

引导会话 0 是当前引导会话。 引导会话 -1 是最后一次引导的会话,依此类推。

journalctl -b -2

想象一下尝试在旧的 syslog 系统中执行此操作!

你不能只得到你所看到的引导日志 /var/log/boot.log. 但是,如果您在引导会话视图中,则引导日志始终位于日志的开头。

过滤特定 systemd 服务的日志日志

过滤是日志日志的一个强项。 您可以根据 systemd 服务过滤日志。

journalctl -u service_name

为了 example,如果要查看SSH生成的日志,可以这样使用:

journalctl -u ssh

当然,您需要知道 systemd 服务名称。

过滤特定时间间隔的日志

这是另一个 example 日志日志的字符串过滤能力。 您可以过滤特定时间段的日志,并且有多种方法可以做到这一点。

您可以使用自然语言来过滤日志。 像昨天、今天和明天这样的术语被识别。

journalctl --since=yesterday --until=now

您还可以指定日期或日期时间组合:

journalctl --since "2020-07-10"

您还可以使用日期和时间指定时间段:

journalctl --since "2020-07-10 15:10:00" --until "2020-07-12"

时间从 00:00:00 开始,它决定了日期和日期。

您还可以使用 -1h20min 等相对时间来指定过去的 1 小时 20 分钟。

根据 UID、GID 和 PID 过滤日志

如果您正在调试问题,您可能需要使用其 PID 检查某个进程的日志。

还可以根据用户 ID (UID)、组 ID (GID) 和进程 ID (PID) 过滤日志日志。 下面是一个 example:

journalctl _PID=1234

提示:组合多个选项以获得更量身定制的日志查看

您可以组合多个选项来查看所需的日志。

为了 example,如果您只想查看 UTC 时间戳中昨天的 SSH 日志,您可以使用:

sudo journalctl -u ssh --since=yesterday --utc

另一个常见的用法是根据引导会话过滤日志。 如果您只想查看当前会话中的 SSH 日志,可以使用:

sudo journalctl -u ssh -b0

可能性是无穷无尽的,您可以根据需要组合选项。

使用 journalctl -xe 查看最后几条日志

你会经常发现有人建议使用 journalctl -xe 命令。

  • -e:跳转到日志日志的末尾
  • -x:显示有关日志条目的额外信息(如果可用)

某些日志条目具有正常日志查看中未显示的附加信息。 使用 -x 选项可能会显示此类信息。

你看到的单行是这样的:

Jul 09 16:33:40 itsfoss systemd[1]: Started Run anacron jobs.

它可以显示更多信息,如下所示:

Jul 09 16:33:40 itsfoss systemd[1]: Started Run anacron jobs.
-- Subject: A start job for unit anacron.service has finished successfully
-- Defined-By: systemd
-- Support: https://www.ubuntu.com/support
-- 
-- A start job for unit anacron.service has finished successfully.
-- 
-- The job identifier is 3702.

附加信息有助于解释错误或日志事件的上下文以及可能的解决方案。

使用 journalctl 仅显示日志中的错误

要显示当前会话中的所有错误,您可以使用:

journalctl -p 3 -xb
  • -p 3 :过滤优先级为 3 的日志(这是错误)
  • -x :提供有关日志的附加信息(如果可用)
  • b :自上次启动(即当前会话)以来

您还可以使用其他优先级来获取调试、警告甚至关键级别的日志。 此表列出了所有优先级。

优先事项代码
0出现
1警报
2暴击
3
4警告
5注意
6信息
7调试

您还可以显示一系列严重性的日志。 为了 example,如果您想查看当前会话中的所有警告、通知和信息日志,您可以使用:

journalctl -p 4..6 -b0

你也可以使用 warning..info 在上面的命令中,而不是 4..6.

检查日志占用了多少磁盘空间

journald 从各种来源收集日志,并存储包括调试日志在内的各种级别的日志。 相信我,虽然保留日志有助于分析和审计,但它们会占用大量磁盘空间。

您可以使用以下 journalctl 命令检查日志日志占用了多少磁盘空间:

journalctl --disk-usage

当您看到输出时,您可能会感到惊讶(或震惊):

[email protected]:~$ journalctl --disk-usage 
Archived and active journals take up 2.8G in the file system.

2.8GB? 好多啊。 您可能想要清除日志日志。

享受使用 journalctl 命令进行日志分析的乐趣

journalctl 命令还有很多选项和用法,我不可能全部介绍。 如果您想了解更多详细信息,我建议您阅读其手册页。

我相信我已经给了你足够的使用 journalctl 命令进行常规日志分析的能力。 我希望你喜欢这个关于日志的详细教程。

如果您有任何建议或问题,请随时发表评论。