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

时间:2020-01-09 10:39:51  来源:igfitidea点击:

Linux系统日志记录随着systemd的引入而改变。了解如何使用journalctl命令来读取和过滤系统日志消息。

集中记录

毫无争议的是," systemd"系统和服务管理器对收集系统日志的方式进行了重大更改。根据创建日志的服务或者守护程序,日志曾经位于文件系统中的不同位置。但是他们都有一个共同点。它们是纯文本文件。

使用systemd,所有系统日志,引导日志和内核日志文件均由中央专用日志记录解决方案进行收集和管理。它们存储的格式是二进制格式。正如我们将看到的,这促进了一件事情,就是能够提取不同格式的数据,例如JSON。

它还可以更容易地交叉引用以前在单独的日志文件中记录的相关信息。由于数据现在保存在单个日记中,因此可以选择多个感兴趣的来源的数据并将其显示在单个交织的条目列表中。

" journalctl"是用于处理日记的工具。

journalctl

我们可以在不使用命令行参数的情况下调用journalctl

journalctl

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

按"结束"键将直接跳到列表的底部,以及最新的日志条目。

按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,名为" data-app"的应用程序将日志条目注入了日志条目,即"来自IGI的新消息"。

更改显示格式

由于日记是二进制文件,因此必须先将日记中的数据转换或者解析为文本,然后才能显示给我们。使用不同的解析器,可以从相同的二进制源数据创建不同的输出格式。 journalctl可以使用几种不同的格式。

默认输出是短格式,这与经典系统日志格式非常相似。要显式请求短格式,请使用-o(输出)选项和short修饰符。

sudo journalctl -n 10 -o short-full

从左到右,这些字段是:

  • 消息创建的时间(以当地时间为准)。

  • 主机名。

  • 进程名称。这是生成消息的过程。

  • 日志消息。

要获取完整的日期和时间戳,请使用short-full修饰符:

sudo journalctl -n 10 -o short-full

此输出中的日期和时间格式是我们在按时间段选择日志消息时需要提供日期和时间的格式,我们将很快看到。

要查看每个日志消息随附的所有元数据,请使用" verbose"修饰符。

sudo journalctl -n 10 -o verbose

有许多可能的字段,但是很少有所有字段都出现在消息中。

值得讨论的一个领域是"优先"领域。在此示例中,其值为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 "2017-91-12 07:00:00"

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

要定义我们要报告的时间段,请同时使用-S(自)和-U(直到)。此命令查看15分钟内的日志消息。

sudo journalctl -S "2017-91-12 07:00:00" -U "2017-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=data-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

根据"优先级"字段中的值,突出显示该消息的重要性。

查看引导消息

如果我们想调查有关引导的问题,可以参考journalctl。也许我们已经添加了新硬件,但它没有响应,或者在上次系统升级后,以前可以使用的硬件组件不再起作用。

要查看与上一次引导相关的日志条目,请使用-b(引导)选项:

journalctl -b

将显示最后一次引导的日志条目。

当我们说最后一次启动时,是指引导计算机进入当前登录会话状态的引导过程。要查看以前的启动,可以使用数字告诉journalctl我们想要的引导。要查看第三个引导,请使用以下命令:

journalctl -b 3

通常,如果我们遇到问题并且必须重新引导计算机,那么这是我们感兴趣的先前引导顺序。因此,这是一种常见的命令形式。

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

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