如何使用 'tail' 命令监控 Linux 日志文件的实时变化

LinuxBeginner
立即练习

介绍

Linux 日志是系统监控和故障排除的基石,它们提供了对系统内部运作的宝贵见解。在本教程中,我们将探讨 Linux 日志的基本概念,以及如何使用多功能的 'tail' 命令有效地监控它们。

你将学习日志文件存储的位置、如何查看它们的内容、跟踪实时变化以及提取特定信息。这些技能对于任何使用 Linux 系统的人来说都至关重要,它们可以帮助你诊断问题、监控系统健康状况,并了解你的系统在幕后做了什么。

了解 Linux 日志文件及其位置

Linux 系统在称为日志文件的专用文本文件中,维护着各种活动、错误和事件的详细记录。这些日志是故障排除问题或监控系统健康状况时的主要信息来源。

Linux 日志存储在哪里?

大多数 Linux 发行版,包括 Ubuntu 22.04,都将日志文件存储在 /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/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)
  • 生成日志的程序或服务
  • 实际的日志消息

了解日志条目结构

大多数日志条目都遵循标准格式,这使得它们更容易阅读和处理。典型的格式包括:

  1. 时间戳 (Timestamp):事件发生的时间
  2. 主机名 (Hostname):机器的名称
  3. 服务/应用程序 (Service/Application):生成日志的内容
  4. 消息 (Message):关于发生了什么的实际信息

现在你已经了解了日志的存储位置以及它们的结构,让我们继续使用 tail 命令查看日志文件中最新的条目。

使用基本的 'tail' 命令查看日志文件

虽然 head 命令显示文件开头,但 tail 命令显示文件的结尾。这对于日志文件特别有用,因为最新的条目通常位于末尾。

'tail' 命令的基本用法

tail 命令的基本语法是:

tail [选项] [文件]

默认情况下,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' 进行实时日志监控

tail 命令最强大的功能之一是它能够使用 -f 选项(“follow”的缩写)实时监控文件。这对于观察日志文件在添加新条目时的变化特别有用,有助于故障排除和监控。

了解 'tail -f'

-f 选项告诉 tail 保持文件打开状态,并持续显示添加到文件中的新行。这会创建日志文件的实时视图,让你能够看到事件的发生。

实时监控系统日志

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

sudo tail -f /var/log/syslog

运行此命令后,你将看到日志文件中最新的条目,并且终端将保持打开状态,显示新出现的条目。

为了生成一些日志条目,让我们打开一个新的终端窗口(按 Ctrl+Alt+T 打开一个新的终端)并运行几个基本命令:

logger "This is a test message from user $(whoami)"

logger 命令将消息发送到系统日志。现在,回到你运行 tail -f 的第一个终端窗口,你应该会看到你的测试消息出现在日志中:

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

尝试使用不同的消息再运行几次 logger 命令,看看它们是否实时出现:

logger "System test number 2"
logger "Monitoring logs is fun!"

这些消息中的每一条都应该在你的 tail -f 输出窗口中显示出来,因为它们被记录下来了。

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

监控身份验证活动

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

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

这将向你显示实时的身份验证活动,例如用户登录、sudo 命令的使用以及身份验证失败。

为了生成一些身份验证日志条目,打开一个新的终端并运行一个 sudo 命令:

sudo ls /root

你应该会看到新的条目出现在你的 tail -f 窗口中,显示 sudo 活动:

May  2 10:38:23 ubuntu sudo:    labex : TTY=pts/1 ; PWD=/home/labex ; USER=root ; COMMAND=/usr/bin/ls /root
May  2 10:38:23 ubuntu sudo: pam_unix(sudo:session): session opened for user root(uid=0) by labex(uid=1000)
May  2 10:38:23 ubuntu sudo: pam_unix(sudo:session): session closed for user root

同样,当你完成观察后,按 Ctrl+C 停止 tail -f 命令。

实时日志监控的实际用例

实时日志监控在几种情况下非常有用:

  1. 故障排除问题:当某些东西无法正常工作时,实时观察日志可以帮助识别问题。
  2. 安全监控:观察身份验证日志可以帮助检测未经授权的访问尝试。
  3. 应用程序调试:开发人员可以观察应用程序日志,以了解测试期间发生的情况。
  4. 系统管理:管理员可以在维护或配置更改期间监控系统日志。

例如,如果你正在排除网络问题,你可以在尝试连接时监控系统日志,以查看出现的任何错误消息。

通过掌握使用 tail -f 进行实时日志监控,你将获得一个强大的工具,用于了解你的系统行为。

过滤日志信息以进行更好的分析

日志文件可能非常大,并且包含大量信息。为了使日志分析更易于管理,你可以将 tail 命令与其他工具(如 grep)结合使用,以过滤和查找特定信息。

将 'grep' 与 'tail' 结合使用

grep 命令用于在文本中搜索模式。当与 tail 结合使用时,它允许你过滤日志条目以查找特定的关键字或模式。基本语法是:

tail [选项] [文件] | grep "模式"

让我们看一些实际的例子:

查找错误消息

要在系统日志中查找错误消息,你可以过滤单词 "error":

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

-i 选项与 grep 一起使用,使搜索不区分大小写,因此它将匹配 "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 时很重要。

现在,在另一个终端中,生成一个测试日志消息:

logger "This is a test message for grep filtering"

在你的第一个终端中,你应该只看到这条消息出现(而不是任何其他日志消息),因为 grep 过滤了 "test"。

使用多个模式进行高级过滤

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

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

-E 选项启用扩展正则表达式,允许你使用 OR 运算符。此命令将显示包含单词 "error"、"warning" 或 "critical" 的任何行。

使用 'awk' 提取特定信息

对于更高级的过滤和格式化,你可以使用 awk 命令。例如,要仅从 syslog 中提取时间和消息:

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 之旅时,你会发现这些日志监控技术将帮助你更好地理解你的系统,更快地诊断问题,并维护一个更安全可靠的环境。