介绍
Linux 日志是系统监控和故障排除的基石,它们提供了对系统内部运作的宝贵见解。在本教程中,我们将探讨 Linux 日志的基本概念,以及如何使用多功能的 'tail' 命令有效地监控它们。
你将学习日志文件存储的位置、如何查看它们的内容、跟踪实时变化以及提取特定信息。这些技能对于任何使用 Linux 系统的人来说都至关重要,它们可以帮助你诊断问题、监控系统健康状况,并了解你的系统在幕后做了什么。
Linux 日志是系统监控和故障排除的基石,它们提供了对系统内部运作的宝贵见解。在本教程中,我们将探讨 Linux 日志的基本概念,以及如何使用多功能的 'tail' 命令有效地监控它们。
你将学习日志文件存储的位置、如何查看它们的内容、跟踪实时变化以及提取特定信息。这些技能对于任何使用 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.
...
注意每个日志条目的格式:
大多数日志条目都遵循标准格式,这使得它们更容易阅读和处理。典型的格式包括:
现在你已经了解了日志的存储位置以及它们的结构,让我们继续使用 tail 命令查看日志文件中最新的条目。
虽然 head 命令显示文件开头,但 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 选项(“follow”的缩写)实时监控文件。这对于观察日志文件在添加新条目时的变化特别有用,有助于故障排除和监控。
-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 命令。
实时日志监控在几种情况下非常有用:
例如,如果你正在排除网络问题,你可以在尝试连接时监控系统日志,以查看出现的任何错误消息。
通过掌握使用 tail -f 进行实时日志监控,你将获得一个强大的工具,用于了解你的系统行为。
日志文件可能非常大,并且包含大量信息。为了使日志分析更易于管理,你可以将 tail 命令与其他工具(如 grep)结合使用,以过滤和查找特定信息。
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 命令。例如,要仅从 syslog 中提取时间和消息:
sudo tail -n 10 /var/log/syslog | awk '{print $3, $5, $6, $7, $8, $9, $10}'
这将从每个日志条目中提取特定字段,使其更容易专注于最相关的信息。
通过掌握这些过滤技术,你可以有效地分析大型日志文件,并提取你所需的用于故障排除和监控的确切信息。
祝贺你完成了关于使用 'tail' 命令监控 Linux 日志文件中实时变化的实验。你已经学习了几项重要的技能:
了解 Linux 日志文件:你现在知道日志存储在哪里,它们包含什么,以及日志条目的结构。
基本日志查看:你可以使用 tail 命令查看日志文件中最新的条目,并指定要显示的行数。
实时监控:使用 tail -f,你可以在日志更新时观察它们,从而观察系统活动并在问题发生时进行故障排除。
过滤日志信息:通过将 tail 与 grep 和 awk 等工具结合使用,你可以从日志中提取特定信息,从而使分析更有效。
这些技能对于任何使用 Linux 系统的人来说都是必不可少的,从初学者到经验丰富的管理员。日志分析是系统维护、故障排除和安全监控的基本组成部分。
在你继续你的 Linux 之旅时,你会发现这些日志监控技术将帮助你更好地理解你的系统,更快地诊断问题,并维护一个更安全可靠的环境。