如何使用 Journalctl 查看和操作 Systemd 日志

介绍

在使用其他工具时,日志通常分散在整个系统中,由不同的戴蒙和流程处理,并且在跨越多个应用程序时可能很难解释。

该日志是用journald对象实现的,它处理了内核、 initrd、服务等产生的所有消息 在本指南中,我们将讨论如何使用journalctl实用程序,该实用程序可以用于访问和操纵日志内存储的数据。

一般思想

systemd日志背后的动力之一是集中管理日志,无论消息来源在何处.由于大部分的启动流程和服务管理由systemd流程处理,因此有意义的标准化日志收集和访问的方式。

通过使用单个实用程序与数据交互,管理员可以根据他们的需求动态显示日志数据,这可以像从三台机器人之前查看启动数据一样简单,或者从两个相关服务连接日志条目以排除通信问题。

以二进制格式存储日志数据也意味着数据可以以随机的输出格式显示,取决于您目前所需要的内容。例如,对于日常日志管理,您可以用来查看日志的标准syslog格式,但如果您决定稍后绘制服务中断,您可以输出每个条目作为一个JSON对象,使其可用于您的图形服务。

systemd日志可以与现有的syslog实现一起使用,或者取代syslog功能,取决于您的需求。虽然systemd日志将覆盖大多数管理员的日志需要,但它也可以补充现有的日志机制。

设置系统时间

使用二进制日志来日志的优点之一是能够在 UTC 或本地时间查看日志记录,默认情况下,‘systemd’ 会显示结果在本地时间。

因此,在我们开始使用日志之前,我们将确保时区设置正确,而systemd套件实际上配备了一个名为timedatectl的工具,可以帮助解决此问题。

首先,看看有哪些时区可用列表时区选项:

1timedatectl list-timezones

这将列出系统上可用的时区. 当您找到匹配您的服务器位置的时区时,您可以使用设置时区选项来设置它:

1sudo timedatectl set-timezone zone

要确保您的机器现在使用正确的时间,请单独使用timedatectl命令,或使用status选项。

1timedatectl status
1[secondary_label Output]
2               Local time: Fri 2021-07-09 14:44:30 EDT
3           Universal time: Fri 2021-07-09 18:44:30 UTC
4                 RTC time: Fri 2021-07-09 18:44:31
5                Time zone: America/New_York (EDT, -0400)
6System clock synchronized: yes
7              NTP service: active
8          RTC in local TZ: no

第一行应该显示正确的时间。

基本日志查看

要查看journald大象收集的日志,请使用journalctl命令。

当单独使用时,系统中的每个日志条目都会显示在一个页面(通常是较少)中,以便您浏览。

1journalctl
 1[secondary_label Output]
 2-- Logs begin at Tue 2015-02-03 21:48:52 UTC, end at Tue 2015-02-03 22:29:38 UTC. --
 3Feb 03 21:48:52 localhost.localdomain systemd-journal[243]: Runtime journal is using 6.2M (max allowed 49.
 4Feb 03 21:48:52 localhost.localdomain systemd-journal[243]: Runtime journal is using 6.2M (max allowed 49.
 5Feb 03 21:48:52 localhost.localdomain systemd-journald[139]: Received SIGTERM from PID 1 (systemd).
 6Feb 03 21:48:52 localhost.localdomain kernel: audit: type=1404 audit(1423000132.274:2): enforcing=1 old_en
 7Feb 03 21:48:52 localhost.localdomain kernel: SELinux: 2048 avtab hash slots, 104131 rules.
 8Feb 03 21:48:52 localhost.localdomain kernel: SELinux: 2048 avtab hash slots, 104131 rules.
 9Feb 03 21:48:52 localhost.localdomain kernel: input: ImExPS/2 Generic Explorer Mouse as /devices/platform/
10Feb 03 21:48:52 localhost.localdomain kernel: SELinux:  8 users, 102 roles, 4976 types, 294 bools, 1 sens,
11Feb 03 21:48:52 localhost.localdomain kernel: SELinux:  83 classes, 104131 rules
12
13. . .

您可能会有页面和数据页面可循环,如果systemd已经在您的系统中很长一段时间,则可以长达数十至数十万行。

格式将是熟悉那些谁是用来标准的syslog日志。然而,这实际上收集的数据从更多的来源比传统的syslog实现是能够的。

您可能会注意到显示的所有时刻标记都是本地时间,现在我们在我们的系统上正确设置本地时间,每个日志登录都可以使用此新信息显示所有日志。

如果您想在UTC中显示时刻标记,您可以使用--utc旗:

1journalctl --utc

日志按时间过滤

虽然访问如此庞大的数据集绝对有用,但如此庞大的信息量可能很难或不可能手动检查和处理,这就是为什么journalctl最重要的功能之一是其过滤选项。

显示当前 boot 的日志

您可以每天使用的最基本的旗帜是b旗,这将向您展示自最近重新启动以来收集的所有日志条目。

1journalctl -b

这将有助于您识别和管理与当前环境相关的信息。

在您不使用此功能并且显示超过一天的靴子的情况下,您会看到journalctl在系统停机时插入了一行,看起来像这样:

1[secondary_label Output]
2. . .
3
4-- Reboot --
5
6. . .

这可以帮助您在逻辑上将信息分为启动会话。

过去的靴子

虽然你通常会想显示当前启动的信息,但有时过去的机器人也会有帮助,日志可以保存许多以前的机器人的信息,因此journalctl可以轻松显示信息。

某些发行版可以默认地保存以前的启动信息,而其他版本则禁用此功能. 要启用持久的启动信息,您可以通过键入:

1sudo mkdir -p /var/log/journal

或者你可以编辑日志配置文件:

1sudo nano /etc/systemd/journald.conf

[日志]部分中,将存储=选项设置为持久以启用持久日志:

1[label /etc/systemd/journald.conf]
2. . .
3[Journal]
4Storage=persistent

当在您的服务器上启用保存以前的机器人时,journalctl提供一些命令,以帮助您将机器人作为一个分区单位工作。

1journalctl --list-boots
1[secondary_label Output]
2-2 caf0524a1d394ce0bdbcff75b94444fe Tue 2015-02-03 21:48:52 UTC—Tue 2015-02-03 22:17:00 UTC
3-1 13883d180dc0420db0abcb5fa26d6198 Tue 2015-02-03 22:17:03 UTC—Tue 2015-02-03 22:19:08 UTC
4 0 bed718b17a73415fade0e4e7f4bea609 Tue 2015-02-03 22:19:12 UTC—Tue 2015-02-03 23:01:01 UTC

这将显示每个启动的行。第一个列是启动的抵消,可以用来轻松地引用journalctl来引用启动。如果您需要绝对的引用,则启动ID位于第二列。

若要显示这些机器人的信息,您可以使用第一列或第二列的信息。

例如,要查看从上一个启动的日志,请使用与-b旗帜的-1相对指针:

1journalctl -b -1

您还可以使用启动 ID 来召回从启动时的数据:

1journalctl -b caf0524a1d394ce0bdbcff75b94444fe

窗口时间

虽然通过启动查看日志条目非常有用,但您通常可能希望请求与系统机器人不相符的时机窗口。

您可以根据任意的时间限制进行过滤,使用 - 自 - 直到选项,这些选项将显示的条目限制在给定的时间之后或之前。

时间值可以以多种格式出现. 对于绝对时间值,您应该使用以下格式:

1YYYY-MM-DD HH:MM:SS

例如,我们可以通过输入查看自2015年1月10日下午5点15分以来的所有条目:

1journalctl --since "2015-01-10 17:15:00"

如果上述格式的组件被放弃,则会应用一些默认值。例如,如果错过日期,则将假定当前日期。如果缺少时间组件,则将取代00:00:00(午夜)。

1journalctl --since "2015-01-10" --until "2015-01-11 03:00"

例如,你可以使用昨天,今天,明天现在的单词。你可以通过将-+提前给一个编号值或在句子构造中使用ago等单词来做相对时间。

要获取昨天的数据,您可以键入:

1journalctl --since yesterday

如果您收到从上午9点开始并持续到一个小时前的服务中断的报告,您可以输入:

1journalctl --since 09:00 --until "1 hour ago"

正如您所看到的,定义灵活的时间窗口来过滤您想要看到的条目是相对简单的。

按感兴趣信息过滤

以上,我们了解了一些方法,您可以使用时间限制来过滤日志数据. 在本节中,我们将讨论如何根据您感兴趣的服务或组件进行过滤。

通过单位

也许最有用的过滤方式是您感兴趣的单元,我们可以使用u选项以此方式过滤。

例如,要查看我们系统上的 Nginx 驱动器的所有日志,我们可以键入:

1journalctl -u nginx.service

通常情况下,您可能还想按时间过滤,以显示您感兴趣的行,例如,要检查今天的服务运行情况,您可以键入:

1journalctl -u nginx.service --since today

例如,如果您的 Nginx 流程连接到 PHP-FPM 单元来处理动态内容,则可以通过指定两个单元来按时间顺序合并两者中的条目:

1journalctl -u nginx.service -u php-fpm.service --since today

这可以更容易地发现不同程序和调试系统之间的相互作用,而不是单个流程。

按进程、用户或组 ID

有些服务会产生各种各样的儿童流程来完成工作. 如果您已经找到了您感兴趣的流程的确切PID,您也可以通过此进行过滤。

例如,如果我们感兴趣的PID是8088,我们可以输入:

1journalctl _PID=8088

在其他情况下,您可能希望显示来自特定用户或组的所有登录条目。这可以通过_UID_GID过滤器来完成。例如,如果您的网页服务器在www-data用户下运行,则您可以通过键入:

1id -u www-data
1[secondary_label Output]
233

之后,您可以使用返回的 ID 来过滤日志结果:

1journalctl _UID=33 --since today

systemd日志有许多可以用于过滤的字段,其中一些是从记录过程中传递的,有些是由journald应用的,使用它在记录时从系统中收集的信息。

领先的低分表示_PID字段是后一种类型。日志会自动记录并索引日志进行后续过滤的过程的 PID。

1man systemd.journal-fields

我们将在本指南中讨论其中的一些内容,但现在我们将讨论另一个有用的选项,该选项可以用来显示特定日志域的所有可用值。

例如,要查看systemd日志有哪些组标识符的条目,您可以键入:

1journalctl -F _GID
 1[secondary_label Output]
 232
 399
 4102
 5133
 681
 784
 8100
 90
10124
1187

这将向您显示日志为组 ID 字段存储的所有值,这可以帮助您构建过滤器。

组成部分路径

我们也可以通过提供路径位置来过滤。

如果路径导致一个可执行的,‘journalctl’会显示涉及该可执行的所有条目,例如,要找到涉及bash可执行的条目,您可以键入:

1journalctl /usr/bin/bash

通常,如果一个单位可用于可执行,该方法更清洁,并提供更好的信息(来自相关的儿童进程的输入等)。

显示内核信息

内核消息,通常在dmesg输出中找到的,也可以从日志中获取。

要只显示这些消息,我们可以将-k--dmesg旗帜添加到我们的命令中:

1journalctl -k

默认情况下,这将显示来自当前启动的内核消息. 您可以使用之前讨论的正常启动选择旗帜指定替代启动。

1journalctl -k -b -5

优先考虑

一个系统管理员经常感兴趣的过滤器是消息优先级. 虽然在非常简单的层面上记录信息往往是有用的,但实际上消化可用的信息时,低优先级的日志可能会分心和困惑。

您可以使用 'journalctl' 仅通过使用 '-p' 选项显示指定优先级或更高优先级的消息。

例如,若要显示仅在错误级别或以上登录的条目,您可以键入:

1journalctl -p err -b

这将显示所有被标记为错误、关键、警报或紧急状态的消息,日志执行标准的syslog消息级别,您可以使用优先级名称或相应的数字值。

  • 0: emerg
  • 1: alert
  • 2: crit
  • 3: err
  • 4: warning
  • 5: notice
  • 6: info
  • 7: debug

上面的数字或名称可以与-p选项互换使用,选择优先级会显示标记在指定级别和以上级别的消息。

更改日志显示器

上面,我们通过过滤来展示了输入选择,但还有其他方法可以修改输出,我们可以调整journalctl显示屏以满足各种需求。

缩小或扩展输出

我们可以通过告诉它缩小或扩展输出来调整journalctl显示数据的方式。

默认情况下,‘journalctl’将显示页面中的整个条目,允许条目向屏幕右侧追踪。

如果您更愿意将输出缩小,将信息被删除的 elipse 插入,则可以使用 --no-full 选项:

1journalctl --no-full
1[secondary_label Output]
2. . .
3
4Feb 04 20:54:13 journalme sshd[937]: Failed password for root from 83.234.207.60...h2
5Feb 04 20:54:13 journalme sshd[937]: Connection closed by 83.234.207.60 [preauth]
6Feb 04 20:54:13 journalme sshd[937]: PAM 2 more authentication failures; logname...ot

您也可以以相反的方向去,并告诉journalctl显示其所有信息,无论它是否包含不可打印的字符。

1journalctl -a

输出到标准外

默认情况下,journalctl 会显示页面中的输出,以便更轻松地使用数据. 但是,如果您计划使用文本操纵工具来处理数据,您可能希望能够输出到标准输出。

您可以使用--no-pager选项做到这一点:

1journalctl --no-pager

它可以立即导入到处理工具中,或重定向到磁盘上的文件中,取决于您的需求。

输出格式

如果您正在处理日志条目,如上所述,您很可能会更容易地分析数据,如果它是更易于使用的格式. 幸运的是,日志可以根据需要以各种格式显示。

例如,您可以通过键入 JSON 输出日志条目:

1journalctl -b -u nginx -o json
1[secondary_label Output]
2{ "__CURSOR" : "s=13a21661cf4948289c63075db6c25c00;i=116f1;b=81b58db8fd9046ab9f847ddb82a2fa2d;m=19f0daa;t=50e33c33587ae;x=e307daadb4858635", "__REALTIME_TIMESTAMP" : "1422990364739502", "__MONOTONIC_TIMESTAMP" : "27200938", "_BOOT_ID" : "81b58db8fd9046ab9f847ddb82a2fa2d", "PRIORITY" : "6", "_UID" : "0", "_GID" : "0", "_CAP_EFFECTIVE" : "3fffffffff", "_MACHINE_ID" : "752737531a9d1a9c1e3cb52a4ab967ee", "_HOSTNAME" : "desktop", "SYSLOG_FACILITY" : "3", "CODE_FILE" : "src/core/unit.c", "CODE_LINE" : "1402", "CODE_FUNCTION" : "unit_status_log_starting_stopping_reloading", "SYSLOG_IDENTIFIER" : "systemd", "MESSAGE_ID" : "7d4958e842da4a758f6c1cdc7b36dcc5", "_TRANSPORT" : "journal", "_PID" : "1", "_COMM" : "systemd", "_EXE" : "/usr/lib/systemd/systemd", "_CMDLINE" : "/usr/lib/systemd/systemd", "_SYSTEMD_CGROUP" : "/", "UNIT" : "nginx.service", "MESSAGE" : "Starting A high performance web server and a reverse proxy server...", "_SOURCE_REALTIME_TIMESTAMP" : "1422990364737973" }
3
4. . .

您可以使用json-pretty格式来更好地处理数据结构,然后将其传递给 JSON 用户:

1journalctl -b -u nginx -o json-pretty
 1[secondary_label Output]
 2{
 3    "__CURSOR" : "s=13a21661cf4948289c63075db6c25c00;i=116f1;b=81b58db8fd9046ab9f847ddb82a2fa2d;m=19f0daa;t=50e33c33587ae;x=e307daadb4858635",
 4    "__REALTIME_TIMESTAMP" : "1422990364739502",
 5    "__MONOTONIC_TIMESTAMP" : "27200938",
 6    "_BOOT_ID" : "81b58db8fd9046ab9f847ddb82a2fa2d",
 7    "PRIORITY" : "6",
 8    "_UID" : "0",
 9    "_GID" : "0",
10    "_CAP_EFFECTIVE" : "3fffffffff",
11    "_MACHINE_ID" : "752737531a9d1a9c1e3cb52a4ab967ee",
12    "_HOSTNAME" : "desktop",
13    "SYSLOG_FACILITY" : "3",
14    "CODE_FILE" : "src/core/unit.c",
15    "CODE_LINE" : "1402",
16    "CODE_FUNCTION" : "unit_status_log_starting_stopping_reloading",
17    "SYSLOG_IDENTIFIER" : "systemd",
18    "MESSAGE_ID" : "7d4958e842da4a758f6c1cdc7b36dcc5",
19    "_TRANSPORT" : "journal",
20    "_PID" : "1",
21    "_COMM" : "systemd",
22    "_EXE" : "/usr/lib/systemd/systemd",
23    "_CMDLINE" : "/usr/lib/systemd/systemd",
24    "_SYSTEMD_CGROUP" : "/",
25    "UNIT" : "nginx.service",
26    "MESSAGE" : "Starting A high performance web server and a reverse proxy server...",
27    "_SOURCE_REALTIME_TIMESTAMP" : "1422990364737973"
28}
29
30. . .

以下格式可用于显示:

  • cat: 只显示消息字段本身.
  • export: 适用于传输或备份的二进制格式.
  • json: 每行一个输入的标准 JSON.
  • json-pretty: JSON 格式化用于更好的人类可读性
  • json-sse: JSON 格式化输出包装以使添加服务器发送事件兼容
  • short: 默认的 syslog 风格输出
  • shortiso: 默认格式扩展以显示 ISO 8601 壁时钟时刻印记。
  • ** ** short-monoton

这些选项允许您以最适合您当前需求的格式显示日志条目。

活动过程监测

journalctl命令模仿管理员使用尾巴来监控活跃或最近的活动。

显示最近的日志

要显示一定数量的记录,您可以使用-n选项,该选项正如尾巴 -n一样。

默认情况下,它会显示最新的 10 个条目:

1journalctl -n

您可以指定您希望在-n后看到数字的条目数量:

1journalctl -n 20

随后日志

要积极跟踪日志,因为它们正在写,你可以使用-f旗帜。

1journalctl -f

要退出此命令,请键入CTRL+C

日志维护

您可能想知道存储我们迄今看到的所有数据的成本,此外,您可能对清理一些较旧的日志和释放空间感兴趣。

查找当前磁盘使用情况

您可以通过使用--disk-usage标志来确定日志当前在磁盘上占用的空间量:

1journalctl --disk-usage
1[secondary_label Output]
2Archived and active journals take up 8.0M in the file system.

删除旧日志

如果您想要缩小日志,您可以通过两种不同的方式来完成这项工作(在systemd版本218和更高版本中可用)。

如果您使用--真空大小选项,您可以通过指定大小来缩小日志,这样将删除旧的条目,直到磁盘上占用的日志空间达到所需的大小:

1sudo journalctl --vacuum-size=1G

您可以缩小日志的另一种方式是通过 - 真空时间选项提供切断时间。 任何超出此时间的条目都被删除。

例如,要保留过去一年的条目,您可以键入:

1sudo journalctl --vacuum-time=1years

限制日志扩展

您可以配置您的服务器以限制日志可以占用多少空间. 通过编辑 /etc/systemd/journald.conf 文件来完成此操作。

以下元素可用于限制日志增长:

  • SystemMaxUse=: 指定日志在永久存储中可以使用的最大磁盘空间。
  • SystemKeepFree=: 指定日志在添加日志条目到永久存储时应该留下的空间量。
  • SystemMaxFileSize=: 控制日志文件在永久存储中可以成长为多大。
  • RuntimeMaxUse=: 指定可在波动存储中使用的最大磁盘空间。

通过设置这些值,您可以控制日志如何在您的服务器上消耗和保留空间. 请记住,SystemMaxFileSizeRuntimeMaxFileSize将针对存档的文件,以达到所述限制。

结论

正如您所看到的,systemd日志对于收集和管理您的系统和应用程序数据非常有用。大多数的灵活性来自于自动记录的庞大元数据和日志的集中性质。

Published At
Categories with 技术
comments powered by Disqus