跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / 管理 SLE Micro 的系统日志

管理 SLE Micro 的系统日志

出版日期:2024-11-12
解释

系统日志文件分析是分析系统时最重要的任务之一。事实上,在对系统进行维护或查错时,第一件事就是要查看系统日志文件。SLE Micro 会自动详细记录系统上发生的几乎一切事件。

原因

本文会说明如何通过查看系统日志来检查系统上发生的情况。

工作量

阅读和理解本文大约需要 20 分钟。

目标

您将大致了解日志文件所在的位置以及如何管理它们。

要求
  • root 特权。

1 可以在哪里找到系统日志文件?

SLE Micro 会记录多种类型的消息,例如,来自内核、SELinux 或其他服务的消息。

内核消息以及已在 systemd 中注册的系统服务的消息都记录在 systemd 日记中(请参见第 4 节 “systemd 日志记录系统 - 日记”)。其他系统日志文件位于 /var/log 目录下。SELinux 消息记录在 /var/log/audit/audit.log 中。有关细节,请参见 SELinux troubleshooting

以下列表提供了在完成默认安装后 SLE Micro 中存在的所有系统日志文件的概述。根据您的安装范围,/var/log 还会包含来自此处未列出的其他服务和应用程序的日志文件。下面所述的某些文件和目录以占位符表示,仅当安装相应的应用程序时才会使用它们。大多数日志文件仅对 root 用户可见。通常,您可以使用编辑器查看这些文件,因为它们是纯文本文件。

重要
重要:不支持的日志文件

utmpwtmplastlog 已从 SLE Micro 中去除,不再受支持。如果有任何应用程序将数据写入这些日志文件,请记住日志文件是不完整的。wtmp 已被 wtmpdb 取代,lastlog 已被 lastlog2 取代。

audit/

来自审计框架的日志。

ConsoleKit/

ConsoleKit 守护程序的日志。该守护程序用于跟踪哪些用户已登录,以及他们如何与计算机交互。

cups/

通用 Unix 打印系统 (cups) 的访问和错误日志。

firewalld

防火墙日志。

krb5/

来自 Kerberos 网络身份验证系统的日志文件。

chrony/

来自网络时间协议守护程序 (chrony) 的日志。

YaST2/

所有 YaST 日志文件。

zypp/

libzypp 日志文件。可参考这些文件获取软件包安装历史。

zypper.log

来自命令行安装程序 zypper 的日志。

2 查看和分析 /var/log 文件

您可以按下文所述使用 CLI 命令查看和分析 /var/log 中的纯文本日志。

要查看日志文件,请使用命令 lessmore。使用 headtail 可查看日志文件的开头和结尾。要实时查看日志文件的追加项,请使用 tail -f。有关如何使用这些工具的信息,请查看它们的手册页。

要在日志文件中搜索字符串或正则表达式,请使用 grepawk 可用于分析和重新写入日志文件。

3 使用 logrotate 管理日志文件

/var/log 下的日志文件每天都在增长,很快就会变得非常庞大。logrotate 工具可帮助您管理日志文件及其增长速度。使用此工具可以自动轮换、去除、压缩日志文件,以及通过邮件发送这些文件。可以定期(每日、每周或每月)或者在超过特定大小时处理日志文件。

通常由 systemd 每日运行 logrotate,因此每天只会修改一次日志文件。但存在一些例外情况:因超过大小限制而修改日志文件时、如果一天内多次运行 logrotate,或者如果启用 --force。查看 /var/lib/misc/logrotate.status 文件可确定上次轮换特定文件的时间。

logrotate 可以根据您的需求进行配置。有关细节,请参见第 3.1 节 “配置 logrotate

3.1 配置 logrotate

例如,主配置文件 logrotate.conf 定义了轮换日志的频率或用于进行数据压缩的工具。在 /etc/logrotate.d/ 中,每个服务都可以有自己的 logrotate 配置。

3.1.1 调整 logrotate.conf

logrotate.conf 的默认版本位于 /usr/etc/ 目录中。如果默认值不符合您的需求,请将文件复制到 /etc/logrotate.conf 中并更改其中的配置值。请勿修改 /usr/etc/ 版本,因为它可能会被系统更新覆盖。可以替换以下值:

weekly

日志轮换的频率。可以使用以下任何值:hourlydailyweeklymonthlyyearly

maxage

可以指定保留日志的天数。

rotate 4

该数字决定了保留被轮换日志的日志轮换次数。如果设置为 rotate 0,将立即删除日志。如果设置为 rotate -1,日志在达到 maxage 值之前不会被去除。

dateext

如果配置文件中存在该选项,被轮换日志的文件名会有一个带日期的扩展名,格式为:logname.YYYYMMDD。如果不存在该选项,默认文件名格式为:logname.1logname.2

compress

如果注释掉,则不会压缩日志。

compresscmduncompresscmd

在该部分,您可以通过设置工具的相应绝对路径来更改默认压缩和解压缩工具。

include PATH

您可以使用日志轮换信息更改文件的默认位置。默认值为 /var/lib/misc/logrotate.status

3.1.2 特定于服务的 logrotate 配置

服务和应用程序在 /etc/logrotate.d 中可以有特定的 logrotate 配置。除了第 3.1.1 节 “调整 logrotate.conf中所述的选项之外,您还可以使用以下配置:

missingok

如果缺少任何指定的日志文件,日志轮换功能不会报告错误。

notifempty

不会轮换空日志文件。

delaycompress

被轮换日志的压缩将推迟到下一次日志轮换。

sharedscripts

表示包含脚本的部分,无论要轮换的日志数量是少,这些脚本都应只执行一次。如果省略,系统会针对每个要轮换的日志文件执行脚本。

size

定义日志文件在日志轮换开始前可以达到的大小。此选项可能会忽略时间安排。该值可以是兆字节 (M)、千字节 (K) 或字节 (B)。

minsize

如果日志的大小超过此值,则根据指定的时间安排轮换日志。该值可以是兆字节 (M)、千字节 (K) 或字节 (B)。

maxsize

指定最大日志文件大小。达到此限制会触发轮换,即使未达到时间间隔也是如此。该值可以是兆字节 (M)、千字节 (K) 或字节 (B)。

4 systemd 日志记录系统 - 日记

systemd 具有自己的日志记录系统,称作日记。日记本身是 systemd 管理的系统服务 systemd-journald.service

该服务会根据从内核、用户进程、标准输入和系统服务错误收到的日志记录信息,维护结构化的索引日记,并以此方式来收集和存储日志记录数据。systemd-journald 服务默认会启用并启动。

日记将日志数据存储在 /var/log/journal/ 中。

4.1 journalctl 命令的用法

本节介绍了一些可用来增强 journalctl 默认行为的常见有用选项。

journalctl 命令使用以下语法:

        journalctl [options…] [matches…]
提示
提示:与特定可执行文件相关的消息

要显示与特定可执行文件相关的所有日记消息,请指定该可执行文件的完整路径:

> sudo journalctl /usr/lib/systemd/systemd

该命令接受以下选项:

-f

仅显示最近的日记讯息,另外,在将新的日志项添加到日记时会列显这些新项。

-e

列显讯息并跳转到日记末尾,以便在页导航中显示最新的项。

-r

以倒序列显日记消息,让最新的项列在最前面。

-k

仅显示内核消息。这与字段匹配 _TRANSPORT=kernel 相同。

-u

仅显示指定 systemd 单元的消息。这与字段匹配 _SYSTEMD_UNIT=UNIT 相同。

> sudo journalctl -u apache2
 [...]
 Jun 03 10:07:11 pinkiepie systemd[1]: Starting The Apache Webserver...
 Jun 03 10:07:12 pinkiepie systemd[1]: Started The Apache Webserver.

4.2 过滤日记日志

在不带选项的情况下调用 journalctl 时,该命令将输出日记的全部内容,最旧的条目列在最前面。可以按特定选项或日记字段过滤输出。

4.2.1 根据时间间隔过滤

您可通过指定开始日期和/或结束日期来过滤 journalctl 的输出。日期规范应采用 2014-06-30 9:17:16 格式。如果省略时间部分,则会假设为午夜。如果省略秒,则会假设为 :00。如果省略日期部分,则会假设为当日。您也可以不采用数字表示,而是指定关键字yesterday todaytomorrow。它们分别表示当日前一天、当日或当日后一天的午夜。如果指定now,则表示当前时间。您还可以指定以 -+ 为前缀的相对时间,分别表示当前时间之前或之后的特定时间。

仅显示从现在开始生成的新讯息,并持续更新输出:

> sudo journalctl --since "now" -f

显示从午夜到凌晨 3:20 的所有消息。

> sudo journalctl --since "today" --until "3:20"

4.2.2 根据引导编号过滤

journalctl 可以根据特定的系统引导过滤消息。要列出所有可用引导,请运行

> sudo journalctl --list-boots
 -1 097ed2cd99124a2391d2cffab1b566f0 Mon 2014-05-26 08:36:56 EDT—Fri 2014-05-30 05:33:44 EDT
  0 156019a44a774a0bb0148a92df4af81b Fri 2014-05-30 05:34:09 EDT—Fri 2014-05-30 06:15:01 EDT

第一列列出引导偏移:0 表示当前引导,-1 表示上一次引导,-2 表示再上一次引导,以此类推。第二列包含引导 ID 后接特定引导的限制时戳。

显示当前引导中的所有消息:

> sudo journalctl -b

如果需要查看来自前一引导的日记消息,请加一个偏移参数。下面的示例将输出前一引导的消息:

> sudo journalctl -b -1

另一种方法是根据引导 ID 列出引导消息。要实现此目的,请使用 _BOOT_ID 字段:

> sudo journalctl _BOOT_ID=156019a44a774a0bb0148a92df4af81b

4.2.3 根据字段过滤

您可以按特定的字段过滤日记输出。要匹配的字段语法为 FIELD_NAME=MATCHED_VALUE,例如 _SYSTEMD_UNIT=httpd.service。您可以在单个查询中指定多个匹配条件,以进一步过滤输出消息。有关默认字段的列表,请参见 man 7 systemd.journal-fields

显示特定进程 ID 生成的消息:

> sudo journalctl _PID=1039

显示属于特定用户 ID 的消息:

# journalctl _UID=1000

显示来自内核环缓冲区的消息(与 dmesg 的生成结果相同):

> sudo journalctl _TRANSPORT=kernel

显示来自服务的标准输出或错误输出的消息:

> sudo journalctl _TRANSPORT=stdout

仅显示指定服务生成的消息:

> sudo journalctl _SYSTEMD_UNIT=avahi-daemon.service

如果指定了两个不同的字段,则仅显示同时与两个表达式匹配的项:

> sudo journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1488

如果两个匹配条件引用了相同的字段,则显示与两个表达式中任意一个匹配的所有项:

> sudo journalctl _SYSTEMD_UNIT=avahi-daemon.service _SYSTEMD_UNIT=dbus.service

您可以使用 + 分隔符将两个表达式组合成一个逻辑 OR。以下示例将显示来自进程 ID 为 1480 的 Avahi 服务进程的所有消息,以及来自 D-Bus 服务的所有消息:

> sudo journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1480 + _SYSTEMD_UNIT=dbus.service

4.3 Journald 配置

> sudo systemctl restart systemd-journald

4.3.1 更改日记大小限制

日记日志数据最多使用 /var/log/journal 所在文件系统的 10% 空间。例如,如果 /var/log/journal 位于 30 GB 的 /var 分区中,则日记最多会占用 3 GB 磁盘空间。要更改此限制,请更改(并取消注释)SystemMaxUse 选项:

SystemMaxUse=50M

4.3.2 将日记转发到 /dev/ttyX

您可以将日记转发到终端设备,以便在首选的终端屏幕(例如 /dev/tty12)上显示相关的系统消息。将以下 journald 选项更改为

ForwardToConsole=yes
TTYPath=/dev/tty12