如何在Linux服务器中使用journalctl分析日志
Linux运维 2021-03-19 09:29 2277

我们知道systemd是大多数主流Linux发行版中默认的系统管理器,它自带了一个新的日志守护进程 "journald"。

多年来,传统的SysVinit系统中的系统和内核日志都是由syslogd处理的,syslogd将日志存储在纯文本文件中,而journald则以二进制格式存储日志。

systemd从系统、内核、各种服务或守护进程等多个来源收集日志,并通过journald提供一个集中管理的解决方案。

这是一个高度精简的过程,可以根据需求查看日志,而syslogd的日志则是通过各种命令,如find、grep、cut等手动分析。

在本文中,我们将演示如何使用 journalctl 命令查看和分析 Linux 系统日志。

journald是什么?

journald是systemd的守护进程,它收集来自系统、内核和服务等不同来源的日志,并以二进制格式存储,以便于操作。

所有这些日志事件都由journald守护进程处理,它提供了一种集中处理日志的方式,无论消息来自哪里。

这为根据你的需要读取日志数据提供了许多显著的优势。

什么是 journalctl?

journalctl 是一个命令行工具,用于查看 systemd 的 journald daemon 收集的日志。

日志日志有很好的索引和结构,允许系统管理员根据各种参数轻松地分析和操作日志,如根据时间、启动顺序、特定服务、严重程度等过滤日志。

1) 如何使系统中的日志持久化?

默认情况下,大多数Linux发行版都启用了日志,但它将日志数据存储在'/run/log/journal/'中,默认情况下,这些数据会在重启时被删除。

要使它们永久化,请执行以下步骤,它将自动为你创建'/var/log/journal/'目录。

请注意:"/var/log/journal/"目录必须拥有正确的所有权和权限,这样systemd-journald服务才能存储数据。

以root用户的身份打开"/etc/systemd/journald.conf "文件,取消对 "Storage=auto "的注释,并将其改为 "Storage=persistent"。或者,你可以使用 sed 命令替换文件中的匹配字符串。

$ sudo sed -i '/Storage/ c\Storage=persistent' /etc/systemd/journald.conf

修改完毕后,可以通过运行以下命令进行确认。

$ cat /etc/systemd/journald.conf

重启 systemd-journald,如下所示。

$ sudo systemctl restart systemd-journald

更改文件权限,如下图所示。

sudo chown -R root:systemd-journal /var/log/journal

现在,你应该可以从以下目录查看日志。

$ ls -lh /var/log/journal

2)了解 journalctl 有用的后缀标识

在进入Journalctl命令之前,你应该知道常用的后缀标识列表,这将使journalctl更容易使用。

-f : 只显示最新的日志和实时日志信息。

-e : 跳到日志的结尾,显示最新事件。

-r : 按时间倒序打印日志信息。

-k : 只显示内核的信息。

-u : 只显示指定系统单元的消息。

-b : 显示特定的启动信息,如果不包括特定的启动会话,则显示当前的启动信息。

-list-boots : 以表格形式显示启动会话,包括它们的 ID,以及与启动相关的第一条和最后一条消息的时间戳。

-utc : 以协调世界时(UTC)表示时间。

-p, -priority= : 按消息的优先级过滤输出。

-S, -since= : 根据启动时间过滤日志。

-U, -until= : 根据结束时间过滤日志。

-disk-usage:显示当前所有日志文件的磁盘使用情况。

3) 如何使用 journalctl 读取日志。

您可以通过各种参数和字段的帮助,根据您的需要过滤日志记录。我们将向您展示如何使用这些参数和字段。

3.a) 使用 journalctl 命令查看基本日志。

当你在没有开关的情况下运行 journalctl 命令时,它显示的是日志的全部内容,最老的条目先列出。

它在后台使用'less'命令来显示日志,因此,你可以使用与'less'命令相同的键来移动日志。因此,你可以使用与'less'命令相同的键来移动日志。

$ sudo journalctl

日志的默认视图可以很容易地被人类阅读,但如果你需要更详细的输出,运行。

$ sudo journalctl -o verbose

3.b) 以相反的顺序显示日志。

正如你所注意到的,上面的输出按时间顺序显示日志。如果要先显示最近的日志,请运行带有'-r'选项的 journalctl 命令。

$ sudo journalctl -r

3.c) 只显示'N'个最近的行数。

您可以使用'-n'选项只显示最近的某几行日志,而不是整个日志,如下所示。

$ sudo journalctl -n 20

3.d) 检查实时日志记录

使用'journalctl'命令的'-f'选项可以查看实时日志,如下所示。这在解决某些问题时很有用。

$ sudo journalctl -f

3.e) 只显示内核日志

可以根据你的需要进行过滤。要想只显示内核日志,请在 journalctl 命令中使用 '-k' 选项,这相当于匹配 '_TRANSPORT=kernel'。

$ sudo journalctl -k

或者

$ sudo journalctl _TRANSPORT=kernel

3.f) 筛选特定的启动会话日志

每次启动系统,都会在日志中创建一个新的启动条目。要列出所有可用的启动项,请运行以下命令。

$ sudo journalctl --list-boots --list-boots

日志引导日志的前缀是一个数字,从0开始。'0'是指当前的启动。Boot session '-1'是指最后一次启动的会话,以此类推。要查看某个特定启动的消息,请运行以下命令。

让我们显示当前启动的所有消息。

$ sudo journalctl -b

要检查之前的启动会话消息的输出,运行以下命令。

$ sudo journalctl -b -1

3.g) 基于时间间隔的过滤方法

日志日志可以根据时间间隔进行过滤。时间过滤器可以使用多个参数,如下所示。要使用时间过滤器,请使用'-S或-since'和'-U或-until'命令行开关。

要过滤从昨天开始的日志,运行以下命令。

$ sudo journalctl -S yesterday

要只过滤今天的日志,运行下面的命令(我们可以使用'today'或'00:00',两者相同)。

$ sudo journalctl -S today

$ sudo journalctl -S 00:00

如果只过滤昨天的日志,请执行以下命令。

$ sudo journalctl --since yesterday --until 00:00

要过滤3月12日以来的日志,请执行以下命令。

$ sudo journalctl -S 2021-03-12

要用日期和时间过滤日志,请运行以下命令。

注意,"日期和时间 "使用以下格式,"年-月-日 "和 "小时:分钟:秒"。

$ sudo journalctl --since "2021-03-11 20:10:00" --until "2021-03-15"

要过滤最近一小时内的消息,请使用以下命令。

$ sudo journalctl -S -1h

3.h) 按优先级过滤

过滤可以应用于消息的优先级,当你想过滤一个特定的消息,如 "警告 "或 "错误 "等时,这很有用。

下表列出了所有的优先级。

$ sudo journalctl -p 3 -b

或者

$ sudo journalctl -p err -b

4) 基于字段的过滤

日志日志可以通过特定字段进行过滤。需要匹配的字段的语法是'FIELD_NAME=MATCHED_VALUE',如'SYSTEMD_UNIT=httpd.service'。同时,您也可以在一个查询中指定多个匹配项,以更方便地过滤输出信息。

4.a) 按单位过滤

要显示指定服务产生的消息,使用下面的命令。同样,你也可以过滤任何服务信息。要查看可用的服务日志,输入 "journalctl -u",然后按TAB键两次。

$ sudo journalctl -u httpd.service

$ sudo journalctl _SYSTEMD_UNIT=httpd.service

4.b) 根据UID、GID和PID过滤日志

要显示特定进程ID产生的消息,运行以下命令。

$ sudo journalctl _PID=1039

要显示特定用户ID产生的消息,运行以下命令。

$ sudo journalctl _UID=1021

要显示特定组ID产生的消息,运行以下命令。

$ sudo journalctl _GID=1050

过滤器可以同时应用于多个字段,但它将只显示符合两个表达式的条目。

$ sudo journalctl _SYSTEMD_UNIT=httpd.service _PID=1500

逻辑表达式可以使用'journalctl'命令,如下图所示。下面的例子显示了Apache服务进程的所有消息和MySQL服务的所有消息。

$ sudo journalctl _SYSTEMD_UNIT=httpd-daemon.service + _SYSTEMD_UNIT=mysqld.service。

4.c) 按文件路径过滤

可以根据运行进程的文件路径进行过滤,如下图所示。

$ sudo journalctl /usr/bin/gnome-shell

4.e) 按设备路径过滤

要过滤与特定设备相关的消息,请运行以下命令:。

$ sudo journalctl /dev/sda

5)检查所有日志文件的磁盘使用情况。

当你为日志启用持久化存储时,它最多使用'/var/log/journal'所在文件系统的'10%'。

要查看日志文件使用了多少存储空间,请运行以下命令。

$ sudo journalctl --disk-usage

在本教程中,我们已经向大家展示了什么是日志,以及如何使用 journalctl 命令根据各种参数过滤日志。

标签:

  • Linux服务器