歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Multitail監視日志和命令輸出

Multitail監視日志和命令輸出

日期:2017/2/27 15:59:21   编辑:Linux教程
日志文件提供重要的匯總信息,有助於了解系統或特定服務器的行為。在 UNIX 和與 UNIX 相似的系統上,日志文件僅僅是文本文件,相關聯的服務器進程或系統日志記錄守護進程在其中寫入消息。所有 UNIX 和與 UNIX 相似的系統都使用一個通用的系統日志記錄守護進程,一般名為 syslogd 或 syslog,它處理來自許多應用程序和服務器的日志輸出。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 中查看幫助
可以使用箭頭鍵滾動這個窗口,按 q 或 Control-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 包還提供 ps、top、vmstat 等命令。如果使用 Linux 之外的其他 UNIX 或與 UNIX 相似的系統,就要小心,因為其他操作系統提供的 watch 命令完全不一樣。例如,在 Berkeley Software Distribution (BSD) 系統上,watch 常常稱為 cmdwatch 或 gnuwatch,因為這些系統有另一個 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 腳本
結束語
監視日志文件、文件的創建過程和大小以及特定命令的多次運行之間的差異是系統管理員的日常任務。本文討論的 tail、multitail 和 watch 命令有助於自動執行這些煩人的任務,可以在做其他工作的同時方便地監視系統的各個方面。
Copyright © Linux教程網 All Rights Reserved