使用 `tail` 实时监控 Linux 日志文件的变化

LinuxBeginner
立即练习

简介

Linux 日志是系统监控和故障排查的基础,能够帮助你深入了解系统内部的运行状况。在本实验中,你将学习 Linux 日志的基本概念,以及如何使用灵活的 tail 命令高效地监控日志。

你将了解日志文件的存储位置、查看日志内容的方法、跟踪实时变化的方式,以及提取特定信息的技巧。这些技能对于任何使用 Linux 系统的人都十分重要,能够帮助你诊断问题、监控系统健康状况,并了解系统在后台执行的操作。

了解 Linux 日志文件及其存储位置

在本步骤中,你将探索 /var/log 目录,并分析典型系统日志条目的结构。Linux 系统会将活动、错误和事件记录到日志文件中,这些文件是故障排查和系统监控的重要信息来源。

Linux 日志存储在哪里?

包括 Ubuntu 22.04 在内的大多数 Linux 发行版,都会将日志文件存储在 /var/log 目录中。让我们先查看这个目录,了解系统中有哪些日志文件。

打开终端并执行以下命令:

ls -l /var/log

你应该会看到类似下面的输出:

total 1048
drwxr-x---  2 root   adm      4096 May  2 09:52 apache2
drwxr-xr-x  2 root   root     4096 Apr 30 15:27 apt
-rw-r-----  1 syslog adm    183867 May  2 10:18 auth.log
-rw-r--r--  1 root   root     1112 Nov 17  2022 alternatives.log
drwxr-xr-x  2 root   root     4096 Apr 20  2022 cups
-rw-r-----  1 syslog adm    308342 May  2 10:18 kern.log
-rw-rw-r--  1 root   utmp        0 Apr 20  2022 lastlog
drwxr-xr-x  2 root   root     4096 Nov  8  2022 nginx
-rw-r-----  1 syslog adm    473079 May  2 10:18 syslog

具体的文件和目录会因镜像及已安装的软件而有所不同。本实验环境会创建 /var/log/syslog/var/log/auth.log/var/log/kern.log,并写入接近真实环境的示例日志,确保你可以稳定地练习每条命令。

常见日志文件及其内容

下面是你经常会遇到的一些重要日志文件:

  • /var/log/syslog:包含常规系统消息
  • /var/log/auth.log:记录身份验证尝试和用户管理相关信息
  • /var/log/kern.log:包含内核消息和错误
  • /var/log/apt:存放软件包管理日志的目录

让我们查看其中一个文件的内容。由于本实验主要学习日志监控,我们先从查看系统日志的基本方法开始:

sudo head -n 20 /var/log/syslog

head 命令用于显示文件开头的若干行,此处显示前 20 行。使用 sudo 是因为某些日志文件只有具备管理员权限的用户才能读取。

你应该会看到类似下面的输出:

May  2 08:23:15 ubuntu systemd[1]: Started Daily apt download activities.
May  2 08:23:15 ubuntu systemd[1]: Starting Daily apt upgrade and clean activities...
May  2 08:23:15 ubuntu systemd[1]: apt-daily-upgrade.service: Deactivated successfully.
May  2 08:23:15 ubuntu systemd[1]: Finished Daily apt upgrade and clean activities.
May  2 08:37:16 ubuntu systemd[1]: Starting Message of the Day...
May  2 08:37:16 ubuntu systemd[1]: motd-news.service: Deactivated successfully.
May  2 08:37:16 ubuntu systemd[1]: Finished Message of the Day.
...

请注意,每条日志通常都包含以下信息:

  • 日期和时间
  • 主机名(本例中为 ubuntu)
  • 生成日志的程序或服务
  • 具体的日志消息

了解日志条目的结构

大多数日志条目都遵循标准格式,因此便于阅读和处理。典型格式包括:

  • 时间戳:事件发生的时间
  • 主机名:计算机的名称
  • 服务或应用程序:生成日志的对象
  • 消息:对所发生事件的具体描述

现在,你已经了解了日志的存储位置及其结构,接下来将使用 tail 命令查看日志文件中的最新条目。

使用基础 tail 命令查看日志文件

在本步骤中,你将使用 tail 检查多个练习日志文件中的最新条目。head 用于查看文件开头的内容,而 tail 用于查看文件末尾的内容;日志文件中最新的记录通常位于末尾。

tail 命令的基本用法

tail 命令的基本语法如下:

tail [options] [file]

默认情况下,tail 会显示文件最后 10 行。让我们使用它查看系统日志:

sudo tail /var/log/syslog

你应该会看到最近的 10 条日志记录:

May  2 10:15:32 ubuntu systemd[1]: Starting Clean php session files...
May  2 10:15:32 ubuntu systemd[1]: phpsessionclean.service: Deactivated successfully.
May  2 10:15:32 ubuntu systemd[1]: Finished Clean php session files.
May  2 10:17:01 ubuntu CRON[8752]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
May  2 10:18:14 ubuntu sshd[8755]: Accepted password for labex from 192.168.1.5 port 52413 ssh2
May  2 10:18:14 ubuntu sshd[8755]: pam_unix(sshd:session): session opened for user labex(uid=1000) by (uid=0)
May  2 10:18:14 ubuntu systemd-logind[698]: New session 4 of user labex.
May  2 10:18:14 ubuntu systemd[1]: Started Session 4 of User labex.
May  2 10:18:15 ubuntu sshd[8789]: Received disconnect from 192.168.1.5 port 52413:11: disconnected by user
May  2 10:18:15 ubuntu sshd[8789]: Disconnected from user labex 192.168.1.5 port 52413

查看指定行数

有时,10 行内容不足以提供所需的上下文。你可以使用 -n 选项指定要显示的行数:

sudo tail -n 5 /var/log/syslog

该命令只会显示文件最后 5 行:

May  2 10:18:14 ubuntu sshd[8755]: pam_unix(sshd:session): session opened for user labex(uid=1000) by (uid=0)
May  2 10:18:14 ubuntu systemd-logind[698]: New session 4 of user labex.
May  2 10:18:14 ubuntu systemd[1]: Started Session 4 of User labex.
May  2 10:18:15 ubuntu sshd[8789]: Received disconnect from 192.168.1.5 port 52413:11: disconnected by user
May  2 10:18:15 ubuntu sshd[8789]: Disconnected from user labex 192.168.1.5 port 52413

查看身份验证日志

/var/log/auth.log 文件包含用户身份验证和安全相关事件的信息。让我们查看其中的最新条目:

sudo tail -n 15 /var/log/auth.log

你可能会看到类似下面的输出:

May  2 10:18:14 ubuntu sshd[8755]: Accepted password for labex from 192.168.1.5 port 52413 ssh2
May  2 10:18:14 ubuntu sshd[8755]: pam_unix(sshd:session): session opened for user labex(uid=1000) by (uid=0)
May  2 10:18:14 ubuntu systemd-logind[698]: New session 4 of user labex.
May  2 10:18:15 ubuntu sshd[8789]: Received disconnect from 192.168.1.5 port 52413:11: disconnected by user
May  2 10:18:15 ubuntu sshd[8789]: Disconnected from user labex 192.168.1.5 port 52413
May  2 10:18:15 ubuntu sshd[8755]: pam_unix(sshd:session): session closed for user labex
May  2 10:18:15 ubuntu systemd-logind[698]: Session 4 logged out. Waiting for processes to exit.
May  2 10:18:15 ubuntu systemd-logind[698]: Removed session 4.
May  2 10:20:01 ubuntu sudo:    labex : TTY=pts/0 ; PWD=/home/labex ; USER=root ; COMMAND=/usr/bin/tail /var/log/syslog
May  2 10:20:01 ubuntu sudo: pam_unix(sudo:session): session opened for user root(uid=0) by labex(uid=1000)
May  2 10:20:01 ubuntu sudo: pam_unix(sudo:session): session closed for user root
May  2 10:21:15 ubuntu sudo:    labex : TTY=pts/0 ; PWD=/home/labex ; USER=root ; COMMAND=/usr/bin/tail -n 5 /var/log/syslog
May  2 10:21:15 ubuntu sudo: pam_unix(sudo:session): session opened for user root(uid=0) by labex(uid=1000)
May  2 10:21:15 ubuntu sudo: pam_unix(sudo:session): session closed for user root

该日志记录了用户登录尝试、会话开启与关闭,以及 sudo 命令的使用情况。它是监控系统安全和排查用户访问问题的重要日志。

查看内核日志

内核是 Linux 操作系统的核心。/var/log/kern.log 文件包含内核生成的消息,对于诊断硬件和驱动程序问题非常有帮助:

sudo tail -n 10 /var/log/kern.log

输出可能如下所示:

May  2 09:15:02 ubuntu kernel: [16789.456123] USB 1-1: new high-speed USB device number 3 using xhci_hcd
May  2 09:15:02 ubuntu kernel: [16789.605432] usb 1-1: New USB device found, idVendor=0781, idProduct=5571, bcdDevice= 1.00
May  2 09:15:02 ubuntu kernel: [16789.605436] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
May  2 09:15:02 ubuntu kernel: [16789.605438] usb 1-1: Product: Ultra
May  2 09:15:02 ubuntu kernel: [16789.605440] usb 1-1: Manufacturer: SanDisk
May  2 09:15:02 ubuntu kernel: [16789.605442] usb 1-1: SerialNumber: 4C530001211124120222
May  2 09:15:02 ubuntu kernel: [16789.606521] usb-storage 1-1:1.0: USB Mass Storage device detected
May  2 09:15:02 ubuntu kernel: [16789.606705] scsi host3: usb-storage 1-1:1.0
May  2 09:15:03 ubuntu kernel: [16790.624553] scsi 3:0:0:0: Direct-Access     SanDisk  Ultra            1.00 PQ: 0 ANSI: 6
May  2 09:15:03 ubuntu kernel: [16790.625045] sd 3:0:0:0: Attached scsi generic sg1 type 0

现在,你已经掌握了查看日志文件最新条目的方法,接下来将学习实时监控日志。这是 tail 命令最强大的功能之一。

使用 tail -f 实时监控日志

在本步骤中,你将跟踪日志文件并生成新的日志条目,以便立即观察变化。-f 选项是「跟踪」(follow)的缩写,它会保持文件处于打开状态,并在新行追加时立即显示这些内容,非常适合故障排查和监控。

理解 tail -f

-f 选项会让 tail 持续打开文件,并不断显示追加到文件中的新行。这样就能实时查看日志,在事件发生时立即观察到相应记录。

实时监控系统日志

让我们使用 -f 选项实时监控系统日志:

sudo tail -f /var/log/syslog

执行此命令后,你会先看到日志文件中的最新条目。终端会保持运行状态,并在新的日志出现时持续显示。

要生成一条日志记录,请打开新的终端窗口(按下 Ctrl+Alt+T),然后追加一条测试消息:

echo "$(date '+%b %e %T') ubuntu $(whoami): This is a test message from user $(whoami)" | sudo tee -a /var/log/syslog

tee -a 会将消息追加到实验用系统日志中。现在回到正在运行 tail -f 的第一个终端,你应该会看到测试消息出现:

May  2 10:34:45 ubuntu labex: This is a test message from user labex

再追加几条消息,观察它们如何实时显示:

echo "$(date '+%b %e %T') ubuntu labex: System test number 2" | sudo tee -a /var/log/syslog
echo "$(date '+%b %e %T') ubuntu labex: Monitoring logs is fun!" | sudo tee -a /var/log/syslog

这些消息写入日志后,都应该会出现在运行 tail -f 的终端窗口中。

观察完日志后,按下 Ctrl+C 停止 tail -f 命令并返回命令提示符。

监控身份验证活动

让我们监控身份验证日志,以观察登录和身份验证相关事件:

sudo tail -f /var/log/auth.log

该命令会实时显示身份验证活动,例如用户登录、使用 sudo 命令以及身份验证失败等。

要生成一条身份验证风格的日志记录,请打开新的终端并追加一个示例事件:

echo "$(date '+%b %e %T') ubuntu sudo: labex ran /usr/bin/ls /root" | sudo tee -a /var/log/auth.log

你应该会在运行 tail -f 的终端窗口中看到新条目:

May  2 10:38:23 ubuntu sudo: labex ran /usr/bin/ls /root

观察完成后,再次按下 Ctrl+C 停止 tail -f 命令。

实时日志监控的实际应用场景

实时监控日志在以下场景中非常有用:

  • 故障排查:当系统出现异常时,实时查看日志有助于快速定位问题。
  • 安全监控:观察身份验证日志可以帮助你发现未经授权的访问尝试。
  • 应用调试:开发人员可以在测试期间查看应用日志,了解程序正在执行的操作。
  • 系统管理:管理员可以在维护或修改配置时监控系统日志。

例如,在排查网络问题时,你可以一边尝试建立连接,一边监控系统日志,从而及时发现出现的错误信息。

掌握使用 tail -f 实时监控日志后,你就拥有了一个能够即时了解系统行为的强大工具。

筛选日志信息以便更高效地分析

在本步骤中,你将结合使用 tailgrepawk,快速定位有用的日志条目。这些筛选工具可以从大量日志中只保留或格式化你需要的信息,使日志分析更加高效。

greptail 结合使用

grep 命令用于在文本中搜索指定模式。与 tail 结合使用时,可以根据关键词或模式筛选日志条目。基本语法如下:

tail [options] [file] | grep "pattern"

下面来看几个实用示例:

查找错误消息

要在系统日志中查找错误消息,可以筛选包含「error」的行:

sudo tail -n 100 /var/log/syslog | grep -i "error"

grep-i 选项会执行不区分大小写的搜索,因此可以匹配「error」、「Error」和「ERROR」等形式。你可能会看到类似下面的输出:

May  2 09:23:45 ubuntu systemd[1]: Failed to start Apache HTTP Server: Job failed with error code.
May  2 09:45:12 ubuntu kernel: [12345.678901] Buffer I/O error on device sdb1, logical block 123456

如果没有任何输出,说明日志最后 100 行中没有错误消息。

监控特定服务

你还可以筛选日志,以监控某个特定的服务或程序。例如,查看与 SSH 相关的活动:

sudo tail -n 100 /var/log/auth.log | grep "sshd"

该命令只会显示身份验证日志中与 SSH 相关的条目:

May  2 10:18:14 ubuntu sshd[8755]: Accepted password for labex from 192.168.1.5 port 52413 ssh2
May  2 10:18:14 ubuntu sshd[8755]: pam_unix(sshd:session): session opened for user labex(uid=1000) by (uid=0)
May  2 10:18:15 ubuntu sshd[8789]: Received disconnect from 192.168.1.5 port 52413:11: disconnected by user
May  2 10:18:15 ubuntu sshd[8789]: Disconnected from user labex 192.168.1.5 port 52413
May  2 10:18:15 ubuntu sshd[8755]: pam_unix(sshd:session): session closed for user labex

实时筛选日志

你还可以将实时监控与筛选结合起来,在事件发生时只关注特定内容:

sudo tail -f /var/log/syslog | grep --line-buffered "test"

--line-buffered 选项会让 grep 在匹配到每一行后立即输出,而不是先将结果缓存在缓冲区中。这一点在使用 tail -f 时尤其重要。

现在,在另一个终端中追加一条匹配的测试消息:

echo "$(date '+%b %e %T') ubuntu labex: This is a test message for grep filtering" | sudo tee -a /var/log/syslog

在第一个终端中,你应该只会看到这条消息,而不会看到其他日志记录,因为 grep 只筛选包含「test」的内容。

使用多个模式进行高级筛选

你还可以在 grep 中使用 OR 运算符(|)搜索多个模式:

sudo tail -n 100 /var/log/syslog | grep -E "error|warning|critical"

-E 选项用于启用扩展正则表达式,使你能够使用 OR 运算符。该命令会显示包含「error」、「warning」或「critical」任意一个单词的行。

使用 awk 提取特定信息

如果需要更高级的筛选和格式化,可以使用 awk 命令。例如,提取系统日志中的时间和消息:

sudo tail -n 10 /var/log/syslog | awk '{print $3, $5, $6, $7, $8, $9, $10}'

该命令会提取每条日志中的指定字段,帮助你集中关注最相关的信息。

掌握这些筛选技巧后,你就能高效分析大型日志文件,并准确提取故障排查和系统监控所需的信息。

总结

恭喜你完成了本实验!在本实验中,你学习了如何使用 tail 命令实时监控 Linux 日志文件的变化,并掌握了以下重要技能:

  1. 了解 Linux 日志文件:你现在知道日志存储在哪里、包含哪些内容,以及日志条目通常如何组织。

  2. 查看日志的基本方法:你可以使用 tail 命令查看日志文件中的最新条目,并指定要显示的行数。

  3. 实时监控日志:借助 tail -f,你可以持续观察日志更新,在系统活动发生时及时了解情况并排查问题。

  4. 筛选日志信息:将 tailgrepawk 等工具结合使用,可以从日志中提取特定信息,提高分析效率。

无论是 Linux 初学者还是经验丰富的管理员,这些技能都十分重要。日志分析是系统维护、故障排查和安全监控的基础工作。

在继续学习 Linux 的过程中,这些日志监控技巧将帮助你更好地理解系统运行状况、更快地诊断问题,并维护更加安全、可靠的运行环境。