syslogd日誌文件的管理

syslogd日誌文件的管理

原文:http://www.linuxpapers.org/show_article.html?LOG_FILES

翻譯:Brimmer

“爲了保證系統正常運行,爲了解決每一天可能遇到的各種各樣的問題,認真地讀取日誌文件是系統管理員的一項非常重要的任務。在這篇文章中,我將會解釋什麼是日誌文件、在哪裏可以找到日誌文件以及如何處理它們”——Gianluca Insolvibile

就算你只在家裏使用Linux,遲早有一天你也會遇到一些奇怪的問題,如:PPP不能用了、X啓動不了了,等等。這時候只能到日誌文件中去尋找一些蛛絲馬跡來解決問題。即使現在系統一切運行正常,作爲系統管理員你也要對日誌有所瞭解。否則,說不定哪一天……

系統日誌文件

就象其它複雜的操作系統那樣,Linux也是由很多不同的子系統組成的,每一個子系統完成一項特定的任務。例如,有些叫做daemon的程序一直在後臺運行(也就是,他們“默默無聞”,不需要和用戶交互),處理一些象打印、發送郵件、建立Internet連接,等等的日常工作。你看不到daemon程序,因爲它們沒有窗口和用戶界面。但是,這些程序有時候也要給用戶傳遞一些信息。爲了實現這個目的,就需要一個特殊的機制。

Linux的內核是有很多子系統組成的,包括網絡、文件訪問、內存管理,等等。子系統需要給用戶傳送一些消息,這些消息內容包括消息的來源,重要性,等等。

這個問題的解決方案必須對內核或其它程序都是一致的,也就是所有的子系統都要把消息送到一個可以維護的公用消息區。於是,就有了一個叫syslogd的程序,這個程序負責接收消息並把消息分發到合適的地方。通常情況下,所有的消息都被拷貝(術語是“記錄”(logged))到特定的文件(叫做“日誌文件”,或簡稱“日誌”(log))中,特別重要的消息也會在用戶終端窗口上顯示出來(請看圖表1)。syslogddaemon的一個很好的例子,它在後臺運行並且把消息從日誌區轉移到日誌文件中去。象大多數的daemon那樣,它的名字也是用字母“d”作爲結尾的。

日誌文件通常是存放在“/var/log”目錄下的。在Slackware 4.0的標準配置下,日誌文件的文件名是messagesdebugsyslog。請注意在Slackware發行版中有多種路徑都可以到達“/var/log”目錄,例如,“/var/adm”和“/usr/adm”都是指向“/var/log”的符號連接。在RedHat 6.0系統中可以發現有多個不同的日誌文件,分別爲:“/var/log/messages”、“/var/log/secure”、“/var/log/spooler”,等等。不同的Linux發行版的配置文件也有一些微小的差別,下面以Slackware爲例,對於其它發行版,你可能需要做一些改動。

圖表 1

查看日誌文件

日誌文件其實是純文本的文件,每一行就是一個消息。只要是在Linux下能夠處理純文本的工具都能用來查看日誌文件。簡單地用cat命名就能把“/var/log/messages”文件中的消息顯示到屏幕上,但是如果這個文件不只一頁,那麼就會因爲顯示滾動得太快看不清文件的內容。日誌文件總是很大的,因爲從你第一次啓動Linux開始,消息都累積在日誌文件中。待會兒,我回介紹如何限制日誌文件的大小,但是請注意最好不要用cat顯示日誌文件的內容,最好也不要用文本編輯器打開日誌文件,這是因爲一方面很耗費內存,另一方面不允許隨意改動日誌文件。看日誌文件的一個比較好的方法是用象moreless那樣的分頁顯示程序,或者用grep查找特定的消息。我們先用less顯示“/var/log/messages”。在圖表二可以看到從日誌文件中取出來的一些消息。每一行表示一個消息,而且都由四個域的固定格式組成:

l時間標籤(timestamp),表示消息發出的日期和時間

l主機名(hostname)(在我們的例子中主機名爲escher),表示生成消息的計算機的名字。如果只有一臺計算機,主機名就可能沒有必要了。但是,如果在網絡環境中使用syslog,那麼就可能要把不同主機的消息發送到一臺服務器上集中處理。

l生成消息的子系統的名字。可以是“kernel”,表示消息來自內核,或者是進程的名字,表示發出消息的程序的名字。在方括號裏的是進程的PID

l消息(message),剩下的部分就是消息的內容了。


Sep 12 10:23:44 escher sendmail[85]: starting daemon (8.9.3): SMTP+queueing@00:15:00


...


Sep 12 11:06:11 escher passwd[337]: password for `progs' changed by `root'


...



Sep 12 11:08:30 escher kernel: Disc change detected.


...


Sep 12 16:06:01 escher login[101]: ROOT LOGIN on `tty2'


...


Sep 18 10:53:26 escher identd[251]: Connection from betelgeuse.branzo.it


Sep 18 10:53:26 escher identd[251]: from: 192.168.9.4 ( betelgeuse.branzo.it ) for: 1024, 21


...


Sep 18 10:54:26 escher su[262]: + ttyp0 branzo-progs


...


Sep 18 11:17:12 escher -- MARK --


Sep 18 11:37:12 escher -- MARK --



Figure 2: Some logs extracted from /var/log/messages


圖表2

在我們的例子中,第一行是sendmail發出的消息,sendmail守護進程(daemon)負責管理收到和發出的消息。這一行是守護進程正常啓動的消息。第二行是來自passwd的消息,提醒我們用戶“progs”的口令被“root”改變過。以後其它的消息,報告我們系統的運行情況。實際上在“/var/log/message”文件中的消息都不是特別重要或緊急的。有一個很有趣的消息是“MARK”消息,在默認情況下每隔20分鐘就會生成一次表示系統還在正常運行。“MARK”消息很象“心跳信號”(heartbeat),例如:“心跳信號”經常用來確認遠程主機是否還在運行。“MARK”消息另外的一個用處是用作事後分析,能夠幫助系統管理員確定系統死機發生的時間。

其它兩個標準的日誌文件是“/var/log/debug”和“/var/log/syslog”,這兩個文件包含一些很重要的消息,例如:調試消息和錯誤提示。圖表三是debug日誌的一個例子。前面的幾行是光盤被mount上一個SCSI設備(內核把它標識爲sr(11,1))時產生的信息而且被識別出來支持具有Joliet擴展的ISO 9660格式(也就是說這張光盤可能是由Windows程序創建的)。注意每一行的消息都包括生成這個消息的內核子系統的名字(VFSISO ExtensionsISOFS)。最後兩行消息來自“sound”子系統,表示聲音子系統初始化成功。


Sep 12 11:26:41 escher kernel: VFS: Disk change detected on device sr(11,1)


Sep 12 11:26:42 escher kernel: ISO 9660 Extensions: Microsoft Joliet Level 3


Sep 12 11:26:42 escher kernel: ISOFS: changing to secondary root


...


Sep 18 10:37:13 escher kernel: Sound initialization started


Sep 18 10:37:13 escher kernel: Sound initialization complete



Figure 3: Some logs extracted from /var/log/debug


圖表3

沒有什麼特殊的原因要把消息分成“debug”、“error”或者“normal”。因爲產生這個消息的子系統爲這個消息設置了一個類別,然後syslogd根據指示把消息分發到相應的文件中去。因此,儘管“sound”子系統的初始化消息屬於別的消息類型,如果程序作者願意還是可以決定把它設置成debug消息。待一會兒,我們會介紹如何準確地分類以及把不同類別的消息和相應的文件關聯起來。

在繼續介紹日誌文件之前,請注意爲了查看日誌文件的內容必須要有“root”權限,因爲日誌文件中的信息對整個系統來說是很重要的,只能讓超級用戶有訪問這些文件的權限。

日誌文件是不斷變大的

新的消息是加在日誌文件的末尾的,因此最新的消息總是在文件的末尾出現。顯示一個長文件末尾幾行的一個方便的方法是使用帶“-n”參數的tail命令。例如,爲了顯示messages日誌文件的最後25行,可以用“tail –n 25 /var/log/messages”或“tail –25 /var/log/messages”。還有一個比較方便的方法是使用less,用“G”命令可以到達文件的末尾:運行“less /var/log/messages”,在退出程序之前按下“G”。用less最大的好處就是可以很方便地上下滾動文件和查找特定的字符串。

爲了等待某個程序的某個特定的消息,可能要不斷地查看日誌文件。如果用不斷地敲tail命令的方法直到消息出現爲止,豈不是太麻煩了?在Linux系統中有一個很方便的方法,就是使用“tail –f /var/log/messages”命令。這個“tail”命令會顯示日誌文件的最後幾行,但是不會馬上退出。它會一直等到其它程序在指定的日誌文件中加入消息行,並且馬上就會把這些消息顯示出來。“less”命令也可以用一個參數實現類似的功能,運行“less +F /var/log/messages”,這樣就可以讓less象“tail –f”那樣運行。而且,less更容易交互使用,因爲你可以在任何時候按“CTRL-C”退出等待消息並回到less的正常模式,然後滾動文件,查找字符串。

讓我們用一個例子來說明:假定你想查看mount一個新的CDROM時產生的消息,而且這些消息發送到“/var/log/debug”文件中。把光盤放到光驅裏,打開一個終端窗口,接着輸入“tail –f /var/log/debug”命令(注意必須有“root”的權限)。然後,在另外一個終端窗口中用“mount /cdrom”或“mount /dev/cdrom”命令mount上光盤,查看第一個出現的信息。這些都很容易吧!請注意在RedHat 6.0中不能用上面的那些方法,因爲在RedHat的標準配置中並不記錄debug消息。但是,如果接着讀下去,你就可以學會改變配置文件。

配置日誌

讓我們仔細地研究一下syslogd守護進程的運行情況。我們曾經說過這個程序是在後臺運行,從系統中獲取新的消息,並把消息發送到合適的地方。我們先看看syslogd可以處理哪些類型的消息。請記住每一個子系統發出日誌消息的時候都會給消息指定一個類型。說得更準確一點,一個消息可以分成兩個部分:“設備”和“優先級”。“設備”標識發出消息的子系統,“優先級”表示消息的重要性,其範圍從7(最不重要)到0(最重要)。圖表4和圖表5是“/usr/include/sys/syslog.h”文件的一部分,在這兩個圖表中可以看到內核2.2.6版本中定義的所有“優先級”和“設備”。

Definition

Value

Comment

LOG_EMERG

0

/* system is unusable */

LOG_ALERT

1

/* action must be taken immediately */

LOG_CRIT

2

/* critical conditions */

LOG_ERR

3

/* error conditions */

LOG_WARNING

4

/* warning conditions */

LOG_NOTICE

5

/* normal but significant condition */

LOG_INFO

6

/* informational */

LOG_DEBUG

7

/* debug-level messages */





Figure 4: Message Priorities


圖表4


Definition

Syslog Name

Comment

LOG_KERN

Kern

/* kernel messages */

LOG_USER

User

/* random user-level messages */

LOG_MAIL

Mail

/* mail system */

LOG_DAEMON

Daemon

/* system daemons */

LOG_AUTH

auth,security

/* security/authorization messages */

LOG_SYSLOG

Syslog

/* messages generated internally by syslogd */

LOG_LPR

Lpr

/* line printer subsystem */

LOG_NEWS

News

/* network news subsystem */

LOG_UUCP

Uucp

/* UUCP subsystem */

LOG_CRON

Cron

/* clock daemon */

LOG_AUTHPRIV

authpriv

/* security/authorization messages (private) */





Figure 5: Message Facilities


圖表5

你必須知道的第二件事是如何配置syslogd。基本的配置是很簡單的,但是一些高級特性的配置需要一些經驗。我們現在看看基本的配置,也就是根據“設備”和“優先級”哪些文件應該收到哪些消息。可以通過編輯編輯文件(通常是“/etc/syslog.conf”)可以對任務進行定製。在開始之前,我們先用less命令看看“/etc/syslog.conf”文件。在圖表6中可以看到在Slackware 4.0中命令運行的結果。以“#”號開頭的行都是註釋行。其它的一些行也很容易理解,他們是由兩個域組成,分別是“選擇器”(selector)和“動作”(action)。“選擇器”用相應的“設備”和“優先級”(都可以用“*”通配符表示“任何一個”)來表示消息的類型。“動作”表示一旦有一個新的消息和“選擇器”相匹配的時候要採取什麼行動。如果“動作”只是一個文件名(剛安裝好的系統一般都是這樣的),那麼消息就會被添加到這個文件中。

# /etc/syslog.conf # For info about the format of this file, see "man syslog.conf" (the BSD man # page), and /usr/doc/sysklogd/README.linux.
*.=info;*.=notice /usr/adm/messages *.=debug /usr/adm/debug
*.err /usr/adm/syslog

Figure 6: Contents of /etc/syslog.conf


圖表6

如果你看看圖表6,就會發現“優先級”等於“info”和“notice”的消息,無論他們的“設備”是什麼,都發到“/usr/adm/messages”文件,因爲在“選擇器”中使用了通配符。同樣“優先級”爲“debug”和“err”的消息都分別送到“/usr/adm/debug”和“/usr/adm/syslog”文件。剛安裝好的RedHat系統沒有處理“debug”消息的那一行,在“syslog.conf”文件中可以加入這一行,這樣就可以正常使用上面介紹的例子了。

編輯完“/etc/syslog”文件之後,還必須運行“killall –HUP syslogd”,這樣所做的改變纔會生效。這個命令發送“HUP”信號給syslog守護進程,通知守護進程重新讀取配置文件。

Syslogd

允許把消息發送給syslogd的程序不僅限於系統程序(例如,守護進程)和內核,任何程序只要使用syslog()C語言函數就能把消息發送給syslogd。這篇文章不是介紹syslog函數的,如果需要得到這函數的信息可以用“man 3 syslog”命令查看,但是如果你只是想試着發一些消息給syslogd可以用logger命令。如果你在一個終端窗口中正在運行“tail –f /var/log/debug”命令,可以試着在另一個終端窗口運行“logger –p user.debug “Hello, world!””。這個消息很快就會在第一個終端窗口中顯示出來。請注意用“-p”參數設置消息的“設備”和“優先級”。RedHat的用戶必須用“tail –f /var/log/messages”和“logger –p user.info “Hello, world!””命令。

總結

在看完這篇簡單的介紹系統日誌的文章之後,你可能還想得到更進一步的信息,那麼最好的方法就是查看man幫助。用“man 8 sysklogd”查看syslogd守護進程的信息;用“man 5 syslog.conf”查看配置文件的格式;如果你很想知道內核是怎麼處理消息的,可以用“man 8 klogd”;用“man 3 syslog”查看有關係統日誌的C語言函數;最後,還可以用“man 1 logger”查看這個命令的用法。





一些/etc/syslog.conf的例子

Example 1.
/etc/syslog.conf內容
# Store critical stuff in critical
#
*.=crit;kern.none /var/adm/critical

這裡使用了本文以上內容未提及的一個特殊符號『=』及代表『除外(exclusive)』的priority『none』。『crit』代表『高於或等於crit』priority的message, 『=crit』是僅代表priority為『crit』的message,『kern.none』則是指facility 『kern』所有的message除外。
這個設定會使得syslogd將除了facility『kern』外的所有facility,priority等級為crit (and crit only)的message記錄到檔案/var/adm/critical中。

Example 2.
/etc/syslog.conf內容
# to another host and to the console
#
1. kern.* /var/adm/kernel
2. kern.crit @finlandia
3. kern.crit /dev/console
4. kern.info;kern.!err /var/adm/kernel-info

1. 將所有『kern』facility相關messages記錄至/var/adm/kernel。
2. 將『kern.crit』、『kern.alert』及『kern.emerg』相關訊息,利用port 143送至遠端主機finlandia記錄。(priority比crit高的訊息有alert及emerg)。
3. 將『kern.crit』、『kern.alert』及『kern.emerg』相關訊息傳送到系統Console。(Console一般是指人為定義的某一臺連接主機的終端機)。
4. 將『kern』相關,priority高於或等於『info』,但priority為『error』除外的訊息記錄至檔案『/var/adm/kernel-info』中。
須注意的是,在/etc/syslog.conf中重複定義的message,都會被syslogd採納並記錄之,例如上面的設定檔中,kern.crit將會分別被記錄至/var/adm/kernel、遠端主機finlandia、/dev/console及/var/adm/kernel-info中。另外在主機finlandia中,syslogd必須配合參數『- r』啟動,2. 中的設定方始有效。

Example 3
# The tcp wrapper loggs with mail.info, we display
# all the connections on tty12
#
mail.=info /dev/tty6

這個設定將mail.info(and mail.info only)的message轉向至系統的第6個Local終端機的銀幕作即時的輸出。在Linux中Hot Key『Alt+F6』將使用者帶至這個終端機。

Example 4
# Log all mail.info and news.info messages to info
#
mail,news.=info /var/adm/info

這個設定將mail.info及news.info的相關message記錄至檔案/var/adm/info

Example 5
# Emergency messages will be displayed using wall
#
*.=emerg *

這個設定將所有facility的emerg事件發生時的相關訊息(例如系統關機),送至當時線上每一個使用者的終端機輸出,用以通知線上的使用者。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章