我们知道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服务器