监视日志和命令输出

监视文件、进程和系统

监视系统日志以及生成文件或目录输出的命令的状态是系统管理员的日常任务。两个流行的开放源码工具可以帮助现代系统管理员简化这些活动:multitailwatch 命令。它们都是面向终端的命令,这意味着它们不依赖于任何图形桌面环境,很容易迁移到大多数 UNIX® 或与 UNIX 相似的系统上。

William von Hagen, 系统管理员,作家, WordSmiths

William von Hagen 担任 UNIX 系统管理员已经超过 20 年,并从 1993 年开始成为 Linux 爱好者。Bill 是一些图书的作者或合著者,涉及的主题包括 Ubuntu Linux、Xen Virtualization、GNU Compiler Collection (GCC)、SuSE Linux、Mac OS X、Linux 文件系统和 SGML。他还为 Linux 和 Mac OS X 出版物和网站撰写了许多文章。



2009 年 9 月 14 日

日志文件提供重要的汇总信息,有助于了解系统或特定服务器的行为。在 UNIX 和与 UNIX 相似的系统上,日志文件仅仅是文本文件,相关联的服务器进程或系统日志记录守护进程在其中写入消息。所有 UNIX 和与 UNIX 相似的系统都使用一个通用的系统日志记录守护进程,一般名为 syslogdsyslog,它处理来自许多应用程序和服务器的日志输出。Linux® 系统还运行 klogd,这是一个专门监视内核消息的守护进程。

使用 tail 命令的传统日志监视

监视系统或服务器日志中的新输出(后面简称为日志)所用的传统命令是 tail 命令,它显示指定的文件中最新的几行(在默认情况下为最新的 10 行)。在执行 tail filename 时,tail 命令显示指定的文件中最新的几行,然后退出。这对于监视日志文件更新帮助不大。为了主动地监视日志文件,常常带 -f 选项调用 tail 命令,这会显示文件中最新的几行,然后在指定的文件中添加新行时显示它们。

常常需要同时监视多个日志文件(这么做至少是有用的)。您希望监视的服务器进程常常写自己的日志文件,而 syslog 把不同类型的消息发送到不同的日志文件(取决于 /etc/syslog.conf 中的配置)。例如,在一个运行 Ubuntu 的服务器系统上,常常需要同时监视 /var/log/auth.log(其中记录身份验证请求和更改)和 /var/log/kern.log(其中记录内核消息)。同样,在运行 Apache Web 服务器的服务器系统上,需要同时监视标准 Apache 日志文件:/var/log/apache2/access.log 和 /var/log/apache2/error.log。

许多系统管理员(包括作者本人)以前会启动多个 xterm(或其他图形化控制台/shell 应用程序),每个 xterm 运行 tail -f 命令监视某一日志文件。这可以提供必需的信息,但是无论使用的字体多么小,都会占用大量屏幕空间。正如本文后面指出的,开放源码社区提供了几个免费的高级工具,可以替代这种原始的文件监视解决方案。


同时监视多个日志文件

实用程序 MultiTail 在 tail 命令的基本功能的基础上提供更多功能,允许用同一个终端应用程序同时监视多个文件。MultiTail(执行的命令为 multitail)是一个采用 GNU Public License (GPL) Version 2 的应用程序,可以在大多数与 UNIX 相似的操作系统中找到,也很容易从源代码构建。构建 multitail 的惟一需求是 ncurses 库,它支持在终端窗口中执行伪图形化操作。

执行 MultiTail 最简单的方法是在命令行上指定要监视的文件的名称。例如,multitail access.log error.log 命令监视 Apache Web 服务器的两个主要日志文件,见 图 1

图 1. 在 MultiTail 中查看多个 Apache 日志
在 MultiTail 中查看多个 Apache 日志

MultiTail 有许多选项,它的 UNIX 手册页中解释了所有选项。在终端会话中运行 MultiTail 时,可以通过各种键盘命令请求帮助、修改显示、搜索文本等等。在任何时候,按 Control-h 即可访问 MultiTail 内置的帮助,这会显示 图 2 所示的帮助窗口。

图 2. 在 MultiTail 中查看帮助
在 MultiTail 中查看帮助

可以使用箭头键滚动这个窗口,按 qControl-g 关闭它。(MultiTail 的帮助也与 F1 键相关联,但是 GNOME 等图形化桌面常常会解释 F1 键,显示它们自己的联机帮助)。


multitail 命令的常用选项

表 1 列出比较常用的一些 MultiTail 命令行选项。

表 1. 常用的 multitail 命令选项
选项说明
--closeidle N可以指定一段时间,如果在这段时间内没有活动,MultiTail 窗口就会关闭。如果您同时监视许多文件,但是只关心经常更新的文件,就可以使用这个选项。尽管这个选项很方便,但是应该谨慎使用,因为在窗口关闭之后,如果文件中写入新的输出,窗口是不会重新打开的。
-i file可以指定要监视的文件的名称。在一般情况下,只需在命令行上列出要监视的文件的名称。可以通过 -i 选项和文件名监视名称以连字符 (-) 开头的文件。如果不使用 -i 选项,那么以连字符开头的文件名会被当作命令行选项。(这很像在 rm 等命令中使用 -- 选项)。
--mark-interval N可以指定一段时间(N 秒),如果在这段时间内没有活动,就会在 MultiTail 输出窗口中显示一个标志行。例如,如果监视 /var/log/auth.log 文件,而在 N 秒内没有记录与身份验证相关的消息,MultiTail 就在这个日志文件的 MultiTail 输出窗口中显示 ---auth.log DATE TIME--- 这样的一行。这在监视多个日志文件时尤其方便,很容易看出哪些日志文件没有记录新消息。
--no-repeat让 MultiTail 不在同一窗口中显示重复的消息,而是显示汇总消息(“Last message repeated N times”)。

图 3 显示以下命令在示例机器上 60 秒后的输出:

    multitail --mark-interval 10 --no-repeat auth.log \
              daemon.log kern.log lpr.log mail.err mysql.err \
              wpa_supplicant.log messages
图 3. MultiTail 中更高级的日志文件显示
MultiTail 中更高级的日志文件显示

图 3 所示,MultiTail 把可用的终端窗口高度分配给要监视的所有文件。在大多数情况下,只需查看日志文件输出中最新的一行或两行,就可以判断出显示的消息是否确实重要。

前面示例中使用的选项只是 MultiTail 选项的一小部分。如图所示,MultiTail 支持多种突出显示方式,包括基于模式的突出显示,可以方便地找到与特定设备相关联或包含特定关键字的消息。

multitail 命令不仅可以监视现有的文件。它还提供 -l command 选项,可以通过这个选项监视命令产生的连续输出。对于快速运行的命令,可以使用 -r N 选项在 N 秒后重复给定的命令。


监视命令输出

有时候,与了解消息内容相比,了解给定的日志文件中是否以及什么时候写入了消息更重要。Apache 的访问日志就是一个好例子;负载大的 Web 服务器可能在几分钟内生成数以千计的日志消息,每个消息都提供详细的信息,这其实用处不大。在这种情况下,大多数系统管理员实际上关心的是,日志是否在不断增长;换句话说,Apache 是否正在运行,用户是否正在访问它。

通过反复执行 ls -l 等命令并对比文件大小,肯定可以实现这个目标。正如前一节末尾指出的,也可以使用 multitail 命令监视命令输出并多次重复指定的命令。但是,这需要几个命令行选项:

    multitail -Rc 2 -l "ls -l access.log error.log"

大多数 Linux 系统上默认安装的 watch 命令提供一个更简单的解决方案。watch 命令以指定的时间间隔自动地运行指定的命令,默认的时间间隔为 2 秒。与 ls -l 等命令结合使用,就可以实现上述的监视效果。图 4 显示 watch ls -l access.log error.log 命令的输出。

图 4. 使用 watch 监视日志文件状态
使用 watch 监视日志文件状态

multitail 命令不同,watch 命令会一直运行,直到被 Control-C 等键盘命令中断。

可以使用 watch 命令观察程序输出随时间的变化,这对于查看文件大小的变化尤其方便,文件大小的变化可以反映调试输出、下载或创建文件的状态、内存或磁盘使用量等信息。例如,运行 watch cat /proc/meminfo 命令就可以实时地查看系统上的内存使用量。如果要监视的命令在每次执行时显示多个不同的输出行,那么可以指定 -d 选项,从而突出显示各次命令运行之间的差异。还可以使用 --differences=cumulative 选项把指定命令的所有运行之间的差异累积起来并突出显示。


不同系统上的 watch 命令并不相同

watch 命令是 procps 包的一部分,这个 GPL v2 包还提供 pstopvmstat 等命令。如果使用 Linux 之外的其他 UNIX 或与 UNIX 相似的系统,就要小心,因为其他操作系统提供的 watch 命令完全不一样。例如,在 Berkeley Software Distribution (BSD) 系统上,watch 常常称为 cmdwatchgnuwatch,因为这些系统有另一个 watch 命令,它监视在指定的物理或虚拟终端上运行的进程。IBM® AIX® 操作系统提供的 watch 命令监视由指定的应用程序创建的进程。

如果您的系统没有提供标准的 watch 命令,您又不愿意花时间构建 procps 包,那么可以用一个简单的 shell 脚本模拟它。这个 shell 脚本名为 simplewatch.sh(见 清单 1),它提供与 watch 命令相同的功能。

清单 1. 与 watch 命令等效的 shell 脚本
    #!/bin/sh

    while [ 1 ] ; do
      clear
      echo "Command: $*"
      date
      echo ""
      ( $* )
      sleep 2
    done

图 5 显示在一个 OpenSolaris 系统上的 /var/log 目录中运行 simplewatch.sh ls -lt \*.log 命令的输出。显示传递给这个脚本的通配符并不是必需的,但是这会让它显示的输出更清晰。

图 5. 运行 simplewatch.sh ls -lt \*.log 命令的输出
在 OpenSolaris 上运行的 simplewatch,sh 脚本

结束语

监视日志文件、文件的创建过程和大小以及特定命令的多次运行之间的差异是系统管理员的日常任务。本文讨论的 tailmultitailwatch 命令有助于自动执行这些烦人的任务,可以在做其他工作的同时方便地监视系统的各个方面。

参考资料

学习

  • MultiTail 主页上寻找更多示例、完整的文档等等。
  • AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
  • AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。
  • AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。
  • 技术书店 浏览关于这些主题和其他技术主题的图书。
  • developerWorks 技术活动网络广播:随时关注 developerWorks 技术活动和网络广播。

获得产品和技术

  • GNU Coreutils 主页下载包含 GNU tail 程序的最新源代码包,或在线查看 完整文档
  • procps 主页下载包含 GNU watch 程序的最新源代码包。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=427976
ArticleTitle=监视日志和命令输出
publish-date=09142009