管理 SLE Micro 的系统日志
- 解释
系统日志文件分析是分析系统时最重要的任务之一。事实上,在对系统进行维护或查错时,第一件事就是要查看系统日志文件。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
用户可见。通常,您可以使用编辑器查看这些文件,因为它们是纯文本文件。
utmp
、wtmp
和 lastlog
已从 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
中的纯文本日志。
要查看日志文件,请使用命令 less
或 more
。使用 head
和 tail
可查看日志文件的开头和结尾。要实时查看日志文件的追加项,请使用 tail
-f
。有关如何使用这些工具的信息,请查看它们的手册页。
要在日志文件中搜索字符串或正则表达式,请使用 grep
。awk
可用于分析和重新写入日志文件。
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
日志轮换的频率。可以使用以下任何值:
hourly
、daily
、weekly
、monthly
或yearly
。-
maxage
可以指定保留日志的天数。
-
rotate 4
该数字决定了保留被轮换日志的日志轮换次数。如果设置为
rotate 0
,将立即删除日志。如果设置为rotate -1
,日志在达到maxage
值之前不会被去除。-
dateext
如果配置文件中存在该选项,被轮换日志的文件名会有一个带日期的扩展名,格式为:
logname.YYYYMMDD
。如果不存在该选项,默认文件名格式为:logname.1
、logname.2
。-
compress
如果注释掉,则不会压缩日志。
compresscmd
和uncompresscmd
在该部分,您可以通过设置工具的相应绝对路径来更改默认压缩和解压缩工具。
-
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” “today”或“tomorrow”。它们分别表示当日前一天、当日或当日后一天的午夜。如果指定“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
5 法律声明 #
版权所有 © 2006–2024 SUSE LLC 和贡献者。保留所有权利。
根据 GNU 自由文档许可证 (GNU Free Documentation License) 版本 1.2 或(根据您的选择)版本 1.3 中的条款,在此授予您复制、分发和/或修改本文档的权限;本版权声明和许可证附带不可变部分。许可版本 1.2 的副本包含在题为“GNU Free Documentation License”的部分。
有关 SUSE 商标,请参见 https://www.suse.com/company/legal/。所有其他第三方商标分别为相应所有者的财产。商标符号(®、™ 等)代表 SUSE 及其关联公司的商标。星号 (*) 代表第三方商标。
本指南力求涵盖所有细节,但这不能确保本指南准确无误。SUSE LLC 及其关联公司、作者和译者对于可能出现的错误或由此造成的后果皆不承担责任。