Linux 中的 Syslog 初学者指南
几十年来,Linux 日志一直由 syslogd 守护进程管理。
Syslogd 会收集系统进程和应用程序发送到 /dev/log 伪设备的日志消息。然后它会将这些消息定向到 /var/log/ 目录中适当的纯文本日志文件。
Syslogd 会知道将消息发送到哪里,因为每个消息都包含包含元数据字段(包括时间戳、消息来源和优先级)的标头。
随着 systemd 的无情、征服世界的强大力量,Linux 日志记录现在也由 journald 处理。我说也,是因为 syslogd 并没有消失,你仍然可以在 /var/log/ 中找到它的大多数传统日志文件。但你需要知道,镇上出现了一位新警长,他的(命令行)名字是journalctl。
但本文不是关于 journald 的。本文的重点是 systemd,因此让我们进一步深入研究一下。
使用 syslogd 进行日志记录
syslogd 系统上事件生成的所有日志都会添加到 /var/log/syslog 文件中。但是,根据其识别特征,它们也可能被发送到同一目录中的一个或多个其他文件中。
50-default.conf
使用 syslogd,消息分发的方式由目录中的文件的内容决定/etc/rsyslog.d/
。
此示例50-default.conf
显示了标记为cron相关的日志消息将如何写入 cron.log 文件。在本例中,星号 (*) 指示 syslogd 发送具有任意优先级的条目(而不是像 emerg 或 err 这样的单一级别):
cron.* /var/log/cron.log
使用 syslogd 日志文件不需要任何特殊工具(如 journalctl)。但如果您想熟练掌握此操作,则需要知道每个标准日志文件中保存了哪些类型的信息。
下表列出了最常见的 syslogd 日志文件及其
用途。
文件名 | 目的 |
---|---|
认证日志 | 系统身份验证和安全事件 |
启动日志 | 启动相关事件的记录 |
消息 | 与设备驱动程序相关的内核环缓冲区事件 |
dpkg日志 | 软件包管理事件 |
内核日志 | Linux 内核事件 |
系统日志 | 所有日志的集合 |
韋斯特 | 跟踪用户会话(通过 who 和 last 命令访问) |
此外,个别应用程序有时会写入自己的日志文件。您还经常会看到创建整个目录(如 /var/log/apache2/ 或 /var/log/mysql/)来接收应用程序数据。
除了之前看到的 * 符号(代表所有优先级)之外,还可以通过八个优先级中的任意一个来控制日志重定向。
等级 | 描述 |
---|---|
调试 | 有助于调试 |
信息 | 信息 |
注意 | 正常情况 |
警告 | 需要警告的情况 |
犯错 | 错误情况 |
暴击 | 危急情况 |
警报 | 需要立即采取行动 |
新兴 | 系统无法使用 |
使用 sysglogd 管理日志文件
默认情况下,syslogd 会在后台处理日志轮换、压缩和删除,无需您的任何帮助。但您应该了解它是如何完成的,以防您的日志需要特殊处理。
一个简单的日志需要什么样的特殊处理?假设您的公司必须遵守与监管或行业标准(如 Sarbanes-Oxley 或 PCI-DSS)相关的交易报告规则。如果您的 IT 基础设施记录必须在较长时间内保持可访问,那么您肯定会想
知道如何通过关键文件找到自己的路。
要查看 logrotate 系统的运行情况,请列出 /var/log/ 目录中的一些内容。例如,auth.log 文件有三种不同的格式:
- auth.log-当前活动的版本,其中写入了新的身份验证消息。
- auth.log.1 -最新停止使用的文件。它以未压缩格式保存,以便在必要时更轻松地快速将其重新投入使用。
- auth.log.2.gz —一个较旧的集合(如您可以从以下列表中的 .gz 文件扩展名中看到的那样),已被压缩以节省空间。
七天之后,当到达下一个轮换日期时,auth.log.2.gz 将被重命名为 auth.log.3.gz,auth.log.1 将被压缩并重命名为 auth.log.2.gz,auth.log 将变为 auth.log.1,并且将创建一个新文件并将其命名为 auth.log。
默认日志轮换周期由 /etc/logrotate.conf 文件控制。此列表中所示的值会在一周活动后轮换文件,并在四周后删除旧文件。
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# packages drop log rotation information into this directory
include /etc/logrotate.
/etc/logrotate.d/ 目录还包含用于管理各个服务或应用程序的日志轮换的自定义配置文件。列出该目录的内容,您会看到以下配置文件:
$ ls /etc/logrotate.d/
apache2 apt dpkg mysql-server
rsyslog
samba
unattended-upgrade
您可以查看其内容以了解它们在日志轮换方面有什么样的配置。
如何读取系统日志文件
您知道,除了阅读数百万行日志条目之外,您还有更好的事情要做。
这里应该完全避免使用 cat。它只会在屏幕上输出数千行。
我建议使用 grep 来过滤文件中的文本。
使用 tail -f 命令可以实时读取当前日志文件。您可以将其与 grep 结合使用以过滤所需的文本。
在某些情况下,您可能需要访问旧的压缩日志。您可以先提取文件,然后使用 grep、less 和其他命令读取其内容,但是,还有更好的选择。有 z 命令(如 zcat、zless 等)可让您处理压缩文件而无需明确提取它们。
日志分析的一个实际例子
这是一个明显的例子,它将在 auth.log 文件中搜索登录尝试失败的证据。搜索单词失败将
返回包含短语身份验证失败的任何行。
偶尔检查一下,可以帮助您发现通过猜测正确密码来破坏帐户的企图。任何人都可能弄错密码一两次,但失败次数过多应该会引起怀疑:
$ cat /var/log/auth.log | grep 'Authentication failure'
Sep 6 09:22:21 workstation su[21153]: pam_authenticate: Authentication failure
如果您是那种从不犯错的管理员,那么此搜索可能会一无所获。您可以使用名为 logger 的程序手动生成日志条目,以保证至少获得一个结果。尝试执行如下操作:
logger "Authentication failure"
您还可以通过登录用户帐户并输入错误的密码来预先植入真正的错误。
正如您所看到的,grep 为您完成了这项工作,但您从结果中只能看到身份验证失败。知道涉及谁的帐户不是很有用吗?您可以通过告诉 grep 返回匹配前后的行来扩展它返回的结果。
此示例将打印匹配项及其周围的线条。它告诉您,使用帐户 david 的某人尝试使用 su(切换用户)登录 studio 帐户,但没有成功:
$ cat /var/log/auth.log | grep -C1 failure
Sep 6 09:22:19 workstation su[21153]: pam_unix(su:auth): authentication
failure; logname= uid=1000 euid=0 tty=/dev/pts/4 ruser=david rhost=
user=studio
Sep 6 09:22:21 workstation su[21153]: pam_authenticate:
Authentication failure
Sep 6 09:22:21 workstation su[21153]: FAILED su for studio by david
下一步是什么?
了解基础知识是一回事,应用知识又是另一回事。然而,基础知识在各种情况下都有帮助。
现在您已经了解了 Linux 中 syslog 的基本知识,在处理日志时您可能会更加得心应手。
本文摘录自 David Clinton 所著的《Linux in Action》一书。该书由 Manning Publication 出版,在结账时输入代码 nlitsfoss22即可享受任何 Manning 书籍30% 的折扣。
享受学习 Linux。