使用 journalctl 命令分析 Linux 日志的初学者指南
systemd是大多数主流 Linux 发行版的默认系统。systemd 的主要功能之一是它收集日志的方式以及它提供的用于分析这些日志的工具。
在传统的SysVinit系统中,syslog会将日志存储在纯文本文件中。读取和分析这些文件需要使用 find、grep、cut 和许多其他命令。
systemd 比 syslogs 收集来自更多来源的日志,以二进制格式保存日志,并为您提供命令行工具来读取、分析和操作日志。这比 syslogs 更精简。
什么是 journald?什么是 journalctl?
journald 是 systemd 的守护进程,用于从各种日志源(如 syslog)收集日志。
journalctl 是允许您与日志进行交互的命令行工具。
使用journalctl可以读取日志,实时监控日志,根据时间,服务,严重性等参数过滤日志。
在本教程中,我将向您展示如何使用 journalctl 读取、监控和分析 Linux 中的日志。
检查系统上是否启用了日志记录
一些 Linux 发行版,特别是桌面发行版,默认不启用日志记录。
journald 日志的默认位置是/var/log/journal
目录。请确保此目录存在。如果不存在,请自行创建。
接下来,在 /etc/systemd/journald.conf 文件中确保将值Storage
设置为auto
或persistent
。
journald.conf 文件显示默认值。因此,即使条目前面有 #,也表示这些是正在使用的默认设置。如果要更改任何内容,请从该行中删除 #。
使用 journalctl 命令
让我向您展示一些 journalctl 命令最基本但最有用的示例。
使用 journalctl 阅读和搜索日志
如果您只是journalctl
在终端中输入,它将按时间顺序显示日志。
journalctl
journalctl 使用下面的命令向您显示日志。这意味着您可以使用与使用less 命令less
相同的键来移动日志。
如果你不记得了,下面让我们快速回顾一下:
钥匙 | 描述 |
---|---|
箭 | 移动一行 |
空间 | 向下移动一页 |
b | 向上移动一页 |
克 | 转到第一行 |
格 | 转到最后一行 |
100克 | 转到第 100 行 |
/细绳 | 从当前位置搜索字符串 |
否 | 转到下一个或上一个搜索匹配项 |
问 | 退出日志 |
如果您不想以 less-like 查看模式显示日志,可以使用标志--no-pager
。这将直接在屏幕上显示整个日志。
journalctl --no-pager
这不是很有用,如果您有大量日志,它会充斥您的屏幕。
按时间倒序显示日志
正如您所注意到的,日志按时间顺序显示。这意味着最旧的存储日志将首先显示。
如果您想首先查看最近的日志,您可以使用以下选项以相反的顺序显示日志-r
:
journalctl -r
它仍然使用类似 view 的 less 命令。因此,按q
退出日志查看模式。
仅显示最近的 N 行日志
您可以选择使用该选项仅显示日志中的一定数量的行,而不是显示所有日志-n
。
例如,以下命令将显示最近的 25 行日志:
journalctl -n 25
实时显示日志
查看最近的日志是一回事,如果要实时查看日志,可以使用-f
journalctl命令的选项:
journalctl -f
与tail命令的-f选项类似,这将在跟踪模式下实时显示日志。
使用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
显示特定启动会话的消息
这是 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 服务的日志
过滤是 journal 日志的一大优势。您可以根据 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 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: 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.8 GB?这可不少。您可能需要清除日志。
使用 journalctl 命令进行日志分析
journalctl 命令还有许多其他选项和用法,我不可能全部介绍。如果你想了解更多详细信息,我建议你阅读它的手册页。
我相信我已经给你足够的知识来使用 journalctl 命令进行常规日志分析。希望你喜欢这篇关于 journald 的详细教程。
如果您有任何建议或疑问,请随时发表评论。