使用journalctl命令在Linux中分析日志的教程

时间:2020-03-05 15:28:20  来源:igfitidea点击:

systemd是大多数主要Linux发行版中的默认设置。

systemd的主要功能之一是它收集日志的方式以及为分析这些日志提供的工具。

在传统的SysVinit系统中,我们具有将日志存储在纯文本文件中的syslog。

读取和分析这些文件需要使用find,grep,cut和许多其他命令。

与syslogs相比,systemd收集的日志来源更多,日志日志以二进制格式保存,并为我们提供了一个命令行工具来读取,分析和处理日志。
比系统日志更简化。

记录了什么?什么是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转到最后一行
100g转到100号线
/string从当前位置搜索字符串
n/n转到下一个或者以前的搜索比赛
Q退出日志

如果我们不希望日志以不太相似的查看模式显示,则可以使用--no-pager标志。
这将直接在屏幕上显示整个日志。

journalctl --no-pager

这不是很有用,如果我们有大量日志,它将淹没屏幕。

以相反的时间顺序显示日志

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

如果要首先查看最近的日志,则可以使用选项-r反向显示日记日志:

journalctl -r

它仍然使用较少的命令,例如view。
因此,按“ q”退出日志查看模式。

仅显示最近的N行日记日志

除了显示所有日志外,我们还可以使用-n选项选择仅显示日志中的特定行数。

例如,以下命令将显示日志的最新25行:

journalctl -n 25

实时显示日记日志

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

journalctl -f

就像tail命令的-f方法一样,这将在关注模式下实时显示日志。

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

显示UTC时间的日志

默认情况下,日志日志显示在系统的本地时间。
如果系统时间设置为UTC以外的时间,并且我们想查看UTC中的日志,则可以使用--utc标志来完成。

journalctl --utc

仅显示带有-k的内核消息

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

journalctl -k

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

Systemd保护将哪种日志显示给哪个用户。

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

Hyman@theitroad:~$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 2017-06-22 12:05:47 UTC, end at Tue 2017-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 2017-07-12 20:43:38 IST—Sun 2017-07-12 22:40:02 IST
  -4 caff16e3f46a4479b5287fb9e294f610 Mon 2017-07-13 07:36:04 IST—Mon 2017-07-13 19:13:44 IST
  -3 5665f41cc50a4dec9955efacc2596d68 Mon 2017-07-13 20:30:55 IST—Mon 2017-07-13 22:20:34 IST
  -2 c7d17407b0bd476a930af503f64b6006 Tue 2017-07-14 07:58:41 IST—Tue 2017-07-14 18:50:04 IST
  -1 7ab5e04518ec455abe0e2c86fdaa46fa Tue 2017-07-14 21:19:27 IST—Tue 2017-07-14 22:42:11 IST
   0 91856e86d4ee4e828717913deb288568 Wed 2017-07-15 08:11:51 IST—Wed 2017-07-15 17:14:10 IST

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

journalctl -b -2

想象一下在旧的syslog系统中尝试这样做!

我们不仅可以获得像在/var/log/boot.log中看到的启动日志。
但是,如果我们处于引导会话视图中,则引导日志始终位于日志的开头。

筛选特定systemd服务的日记日志

筛选是日记日志的重点。
我们可以基于systemd服务过滤日志。

journalctl -u service_name

例如,如果要查看由SSH生成的日志,可以按以下方式使用它:

journalctl -u ssh

我们当然需要知道systemd服务名称。

过滤特定时间间隔的日志

这是日记日志的字符串过滤功能的另一个示例。
我们可以过滤特定时间段的日志,并且有多种方法可以执行此操作。

我们可以使用自然语言来过滤日志。
可以识别昨天,今天和明天之类的术语。

journalctl --since=yesterday --until=now

我们还可以指定日期或者日期时间组合:

journalctl --since "2017-07-10"

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

journalctl --since "2017-07-10 15:10:00" --until "2017-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选项可能会显示此类信息。

我们看到的像这样的一行:

May 09 16:33:40 itstheitroad systemd[1]: Started Run anacron jobs.

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

May 09 16:33:40 itstheitroad 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

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

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

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

journalctl --disk-usage

看到输出时,我们可能会感到惊讶(或者震惊):

Hyman@theitroad:~$journalctl --disk-usage 
Archived and active journals take up 2.8G in the file system.

2.8 GB?好多啊。我们可能要清除日记日志。