本文是 i 春秋作家「xiehudie」表哥分享的技术文章,旨在为大家提供更多的学习方法与技能技巧,文章仅供学习参考。本套Linux进阶教程共分为14章,欢迎大家前来系统学习。
前期回顾>>
![Linux进阶教程丨第2章:从命令行管理文件](https://p1-tt.byteimg.com/origin/pgc-image/cd1318395163497db4a70b69d6ebd8f9.png?from=pc)
第9章:分析和储存日志
一、系统日志记录
进程和操作系统内核为发生的事件记录日志,这些日志用于系统审核和问题的故障排除。许多系统都以文本文件的方式记录事件日志,而这些文件保持在/var/log目录中。可以使用常规文本使用程序检查这些日志,在Linux中,则建立了一个基于Syslog协议的标准日志记录统。许多程序使用此系统记录事件,并将它们整理到日志文件中,systemd-journald和rsyslog服务则用于处理Linux中的syslog消息。
Systemd-journald服务是操作系统事件日志架构的核心。它收集许多来源的事件消息,包括内核、引导过程早期阶段的输出、守护进程启动和运行时的标准输出及标准错误,以及syslog事件。然后,它会将它们重构为一种标准格式,并写进带有索引的结构化系统日志中,默认情况下,该日志存储在系统重启后不保留的文件系统上。
不过,rsyslog服务会从日中中读取systemd-journald收到的syslog消息。之后,它将处理syslog事件,将它们记录到日志文件中,或根据自己的配置将它们转发给其他服务。
Rsyslog服务对syslog消息进行排序,并将它们写入到系统重启后不保留的日志文件中。Rsyslog服务会根据发送每条消息的程序类型或设备以及每条syslog消息的优先级将日志消息排序到特定的日志文件。
除了syslog消息文件外,/var/log目录中还包含系统上其他服务的日志文件。(如下面所示)
二、查看系统日志文件
许多程序使用syslog协议将事件记录到系统,每一日志消息根据设备和优先级分类。(下面是优先级到高到低的排序)
Rsyslog服务使用日志消息的设备和优先级来确定如何进行处理,其配置规则位于/etc/rsyslog.conf文件和/etc/rsyslog.d目录中拓展为.conf的任何文件。通过在/etc/rsyslog.d目录中安装适当的文件,软件包也可以轻松地添加规则。
每个控制着syslog消息排序方式的规则都对应了其中一个配置文件中的一行。每行左侧表示与规则匹配的syslog消息的设备和严重性,每行右侧表示将日志保持到的文件。星号(*)是一个匹配所有值的通配符。
日志消息有时会匹配rsyslog.conf中的多条规则。在这种情况下,一天消息会存储到多个日志文件中,为限制存储的消息,优先级字段中的关键字none指出不应将指定设备的消息存储在给定的文件中。除了将syslog消息记录到文件中外,也可将它们显示到所有已登录用户的终端。
监控一个或多个日志文件中的事件有助于重现问题。例如,要监控失败的登录尝试,需要我们在一个终端运行tail命令,然后在用户尝试登录时在另一个终端以root用户身份运行ssh命令。
三、查看系统日志条目
Systemd-journald服务将日志数据存储在带有索引的机构化二进制文件中,该文件称为日志。此数据包含与日志事件相关的额外信息。要从日志中检索日志消息。我们可以用journalctl命令来查看日志中所有消息,或根据各种选项和标准来搜索特定事件。如果以root身份运行该命令,则对日志具有完全访问权限,普通用户也可以使用该命令,但可能会被限制查看某些消息。
Journalctl命令突出显示重要的日志消息:优先级为notice或warning的消息显示为粗体文本,而优先级为error或以上的消息显示为红色文本。默认情况下,journalctl -n显示最后10个日志条目,我们可以借助参数对此进行调整,它可以指定要显示的日志条目。
使用journalctl命令查看后五行日志条目:
为了帮助对问题进行故障排除,可能需要根据日志条目的优先级过滤日志输出。Journalctl -p可以接受优先级的名称或者编号作为参数,并显示该优先级及以上的日志条目。Journalctl命令理解debug、info、notice、warning、err、crit、alert、alert和emerg优先级。
使用journalctl命令查看优先级为err或以上的日志条目:
除了日志的可见内容外,日志条目中还附带了只有在打开详细输出时才能看到的字段,任何显示的额外字段都可用于过滤日志查询的输出,这可用于减少查找日志中特定事件的复杂搜索的输出。
下面提供了系统日志的常用字段,可用于搜索与特定进行或事件相关的行。
四、保留系统日志
默认情况下,系统日志保持在/run/log/journal目录中,这意味着系统重启时这些日志会被清除。我们可以在
/etc/systemd/journald.conf文件中更改systemd-journald服务的配置设置,使日志在系统重启后保留下来。/etc/systemd/journald.conf文件中的Storage参数决定系统日志以易失性方式存储,还是在系统重启后持久保留,主要有以下三个参数:
Persistent:将日志存储在/var/log/journal目录中,这可在系统重启后持久保留,如果/var/log/journal目录不存在,systemd-journald服务会创建它。
Volatile:将日志存储在易失性/run/log/journal目录中,因为/run文件是临时的,仅存在与运行时内存中,存储在其他的数据不会在系统重启后持久保留。
Auto:rsyslog决定使用持久存储还是易失性存储,如果/var/log/journal目录存在,那么rsyslog会使用持久存储,否则使用易失性存储。如果未设置storage参数,此为默认操作。
要将systemd-journald服务配置为在系统重启后持久保留系统日志,我们需要在
/etc/systemd/journald.conf文件中将storage设为persistent。以超级用户运行我们的文本编辑器,来编辑/etc/systemd/journald.conf文件。编辑配置文件后,重新启动systemd-journald服务使配置更改生效。
如果systemd-journald服务重新启动,我们可以看到/var/log/journal目录已创建好,并且包含一个或多个子目录,这些子目录的长名称中包含十六进制字符,含有*.journal文件。*.journal文件是存储带有索引的结构化日志条目的二进制文件。