如何在Linux中使用journalctl命令分析日志
使用journalctl命令在Linux中查看、过滤和分析日志日志的初学者指南。
systemd 是大多数主要 Linux 发行版的默认设置。 systemd 的主要功能之一是它收集日志的方式以及它提供的用于分析这些日志的工具。
在传统的 SysVinit 系统中,您有 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 命令相同的键来移动日志。
如果你不记得了,这里有一个快速回忆:
- Arrow
移动一行
- Space
下移一页
- b
上移一页
- g
转到第一行
- G
转到最后一行
- 100g
转到第 100 行
- /string
从当前位置开始搜索字符串
- n/N
转到下一个或上一个搜索匹配项
- q
退出日志
如果您不希望日志以不太相似的查看模式显示,可以使用 --no-pager
标志。这将直接在屏幕上显示整个日志。
journalctl --no-pager
这不是很有用,如果您有大量日志,它会淹没您的屏幕。
按时间倒序显示日志
正如您所注意到的,日志按时间顺序显示。这意味着首先显示最旧的存储日志。
如果您想先查看最近的日志,可以使用选项 -r
以相反的顺序显示日志日志:
journalctl -r
它仍然使用类似视图的 less 命令。因此,请按 q
退出日志查看模式。
仅显示最近 N 行日志日志
您可以使用 -n
选项选择仅显示日志中的特定行数,而不是显示所有日志。
例如,下面的命令将显示最近 25 行日志:
journalctl -n 25
实时显示日志日志
查看最近的日志是一回事,如果你想实时查看日志,可以使用journalctl命令的-f
选项:
journalctl -f
与tail命令的-f选项一样,这将以follow模式实时显示日志。
使用Ctrl+C命令退出实时视图。
以 UTC 时间显示日志
默认情况下,日志日志以系统的本地时间显示。如果您的系统时间设置为 UTC 以外的时间,并且您想要查看 UTC 格式的日志,则可以使用 --utc
标志来实现。
journalctl --utc
使用 -k 仅显示内核消息
systemd 日志累积来自不同来源的日志。如果您只想查看Linux内核日志,可以使用选项-k
。
journalctl -k
提示:使用 sudo 查看所有日志日志
Systemd 会保护向哪个用户显示哪种日志。
如果您是普通用户,它可能会显示一些日志,但不会显示所有日志:
abhishek@linux:~$ 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
显示来自特定启动会话的消息
这是 junrald 的一个出色的功能。 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
想象一下尝试在旧的系统日志系统中执行此操作!
您不能只获取像 /var/log/boot.log
中看到的那样的启动日志。但是,如果您处于启动会话视图,则启动日志始终位于日志的开头。
过滤特定 systemd 服务的日志日志
过滤是日志日志的强项。您可以根据 systemd 服务过滤日志。
journalctl -u service_name
例如,如果你想查看 SSH 生成的日志,你可以这样使用:
journalctl -u ssh
当然,您需要知道 systemd 服务名称。
过滤特定时间间隔的日志
这是日志日志的字符串过滤功能的另一个示例。您可以过滤特定时间段的日志,有多种方法可以做到这一点。
您可以使用自然语言来过滤日志。昨天、今天和明天等术语是可以识别的。
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) 进行过滤。下面是一个例子:
journalctl _PID=1234
提示:结合多个选项以实现更定制的日志查看
您可以组合多个选项来查看所需的日志。
例如,如果您只想查看昨天的 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 linux systemd[1]: Started Run anacron jobs.
它可以显示更多信息,如下所示:
Jul 09 16:33:40 linux systemd[1]: Started Run anacron jobs.
-- Subject: A start job for unit anacron.service has finished successfully
-- Defined-By: systemd
-- Support: http://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
调试
您还可以显示一系列严重性的日志。例如,如果您想查看当前会话的所有警告、通知和信息日志,您可以使用:
journalctl -p 4..6 -b0
您还可以在上述命令中使用 warning..info
而不是 4..6
。
检查日志占用了多少磁盘空间
Journald 从各种来源收集日志,并存储各种级别的日志,包括调试日志。相信我,虽然保留日志有助于分析和审计,但它们可能会占用大量磁盘空间。
您可以使用此journalctl命令检查日志日志占用了多少磁盘空间:
journalctl --disk-usage
当您看到输出时,您可能会感到惊讶(或震惊):
abhishek@linux:~$ journalctl --disk-usage
Archived and active journals take up 2.8G in the file system.
2.8GB?好多啊。您可能想要清除日志日志。
使用journalctl命令享受日志分析
Journalctl 命令还有更多选项和用法,我不可能全部涵盖。如果您想了解更多详细信息,我建议您阅读其联机帮助页。
我相信我已经给你足够的知识来使用journalctl命令进行常规日志分析了。我希望您喜欢这个有关 Journald 的详细教程。
如果您有建议或疑问,请随时发表评论。