你的系统上出现问题时,要做的头一件事就是查看日志。本文作者介绍了在Linux下查看日志的具体方法。
在你作为Linux管理员的职业生涯中,应该早晚都会查看日志文件。因为日志文件可以帮助你排查问题,每个经验丰富的管理员在出现问题后,要做的头一件事就是查看日志。
你会发现许多日志:系统日志、内核日志、软件包管理器日志、Xorg日志、启动进程日志、Apache日志、MySQL日志… 你能想到的几乎任何系统都有相应的日志文件。
大多数日志文件位于一个便利的位置:/var/log。这些都是系统和服务日志,你的操作系统或某一项重要服务出现问题时,会高度依赖这些日志。如果是针对特定桌面应用程序的问题,日志文件会被写入到不同的位置(比如Thunderbird把崩溃报告写入到 ‘~/.thunderbird/Crash Reports’)。桌面应用程序把日志写入到何处取决于开发人员,以及应用程序是否允许自定义日志配置。
我们会着重介绍系统日志,因为这是Linux故障排查的核心所在。而这里的一个关键问题是,你如何查看那些日志文件?
幸好,你有众多方法可以查看系统日志,它们都只要从命令行来执行即可。
/var/log
这是Linux系统上一个至关重要的文件夹。打开终端窗口,执行命令cd /var/log。现在执行命令ls,你就会看到位于该目录下面的日志(见图1)。
图1:列出了位于/var/log/下的日志文件
现在,不妨看一看其中一个日志。
使用less查看日志
/var/log里面包含有最重要的日志之一是syslog。这个特殊的日志文件记录下了除验证相关消息之外的一切信息。假设你想查看这一个日志文件的内容,可以迅速执行命令less /var/log/syslog。这个命令会打开syslog日志文件,显示文件首部。然后,你可以使用箭头键每次向下滚动一行,使用空格键每次向下滚动一页,或者使用鼠标轮,轻松滚动浏览文件。
这种方法有一个问题,那就是syslog会变得相当庞大;另外,考虑到你要找的信息极有可能在底部或靠近底部,你可能不想把时间耗费在每次逐行或逐页滚动进入到尾部,由于在less命令中syslog已打开,你还可以按[Shift]+[g]组合键,立即进入到日志文件的尾部。尾部会标以(END)。然后,你可以用箭头键或滚动轮向上滚动,找到你想要的具体信息。
当然,这不是很高效。
使用dmesg查看日志
dmesg命令输出内核环缓冲区。默认情况下,该命令会显示来自内核环缓冲区的所有信息。从终端窗口,执行命令dmesg,整个内核环缓冲区的内容就会输出显示(见图2)。
图2:USB外部驱动器显示了需要研究的一个问题
幸好,有一种内置的控制机制让你得以仅仅输出某些程序模块(facility,比如守护进程)。
假设你想查看用户程序模块的日志项,可执行命令dmesg --facility=user。要是有什么信息记录到该工具,它会输出结果。
不像less命令,执行dmesg会显示日志的全部内容,并让你进入到文件尾部。你始终可以使用滚动轮来浏览终端窗口的缓冲区(如果适用的话)。相反,你会想要把dmesg的输出通过管道命令输入到less命令,就像这样:
dmesg | less
上述命令会输出dmesg的内容,让你可以滚动浏览输出,就像使用less命令查看标准日志那样。
使用tail查看日志
tail命令可能是用于查看日志文件的最方便的工具之一。tail的功能就是输出文件的尾部内容。所以,如果你执行命令tail /var/log/syslog,它只会输出syslog文件的尾部几行。
但是等一下,好玩的并不仅限于此。tail命令有一个很重要的技巧,这需要借助使用-f选项。如果你执行命令tail -f /var/log/syslog,tail会继续监视日志文件,输出写入到文件的下一行。这意味着你可以在终端窗口里面实时关注什么写入到syslog(见图3)。
图3:使用tail命令,关注/var/log/syslog
以这种方式使用tail对于排查问题大有帮助。
在关注文件时想退出tail命令,只需按 [Ctrl]+[x]组合键。
你还可以指示tail只关注某几行。假设你只想查看写入到syslog的尾部5行;为此,你可以执行这个命令:
tail -f -n 5 /var/log/syslog
上述命令会关注syslog的输入,只输出最近的5行。一旦有新的行写入到syslog,它会将最早的那一行从首部删除。这是让关注日志文件这个过程更容易的一种好方法。我强烈建议别使用这种方法来查看少于四五行的日志,因为你最后会发现输入被截断,无法获得某项的全部细节。
还有其他工具
你会找到其他命令(甚至几个还不错的GUI工具)以便查看日志文件。预计more、grep、head、cat、multitail和系统日志查看器(System Log Viewer)可以帮助你通过日志文件来排查系统问题。