Chapter 11 Syslog and Log Files(記錄檔)
前 言
伺服器的運作通常是全年無休,24小時運轉,Linux作業系統的系統日誌(System
log)能幫你記錄系統中發生過的大小事件。一個管理者每天必須查看系統記錄,隨時掌握系統健康狀況,也應該要了解系統日誌運作原理,依照本身需求,打造一個適當的系統記錄
,並能靈活運用系統日誌,提供穩定的電腦使用環境。
本文介紹Linux作業系統的記錄檔案(System Log)機制,針對syslog.conf說明系統日誌環境的設定,並對系統日誌的使用與管理提出一些應該注意事項。
UNIX作業系統的系統記錄
系統記錄檔記錄系統中所發生事件的人、事、時、地、物等相關訊息,藉由這些訊息,管理者可以了解到系統已顯現或潛藏的問題所在,並據此做出決策,以解決或預防此類事件影響系統正常運作。
UNIX上的系統記錄,基本上可以分成三類:
一、 syslogd無關系統記錄:
系統核心記錄了一些與使用者帳號存取有關的訊息,此類是與syslogd這個程式無關的。例如wtmp、utmp、lastlog、pacct等。
二、 syslogd相關系統記錄檔:
syslogd是UNIX中負責記錄大部分系統事件(event)的一個背景程式(daemon),syslogd可以經由設定,記錄包括核心、系統程式及使用者自行開發程式的運作情形及所發生的事件。
三、 應用程式運作記錄檔:
UNIX中的應用程式,如Web Server,本身也會提供類似的記錄,管理者必須了解,但這不在本文探討範圍。例如Apache Server的access.log及error.log等。
系統的記錄一般以純文字或特殊格式的方式記錄於檔案中。前者的訊息可以用任何文字編輯緝查閱,上述第二類及大部分的第三類記錄檔屬之;後者則必須透過特殊程式查詢,上述第一類記錄檔屬之。以下針對第一類及第二類的記錄檔作功能性的描述。本文所有例子均以RedHat
Linux 6.0為例,其他版本UNIX會有一些小差異。
Syslogd無關系統記錄檔
/var/log/wtmp (or
/var/adm/wtmp in some kind of UNIX)
記錄檔功能:記錄使用者(過去及目前)何時由何處進入系統、停留多久及系統開關機時間等訊息。
檔案內容查閱指令:last [-option]
可用參數例子:
last 顯示所有系統user login記錄
last –a 顯示所有系統user login記錄,並將hostname 放在最後一個欄位
last –100 顯示最後100個系統user login記錄
last woody 顯示由woody login 記錄
實際使用例子:
[root@test /]# last -a -7
woody pts/0 Mon Jan 17 23:49 still logged in woody
woody pts/0 Mon Jan 17 23:31 - 23:49 (00:17) woody
woody tty3 Mon Jan 17 23:26 still logged in
root tty1 Mon Jan 17 23:24 still logged in
reboot system boot Mon Jan 17 23:24
root tty3 Mon Jan 17 10:47 - down (00:07)
woody pts/1 Tue Jan 18 09:07 - 09:08 (-23:-59) woody
/var/log/utmp
(or /var/adm/utmp in some kind of UNIX)
記錄檔功能:記錄目前登入系統使用者(仍在線上)資訊。包括使用者名稱、使用tty、login系統時間、由何處login系統、使用CPU狀況及目前正在執行之程式。
檔案內容查閱指令:w 、who
實際使用例子:
[woody@test woody]$ w
10:36pm up 23:12, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - Mon11pm 23:07m 0.21s 0.06s -bash
woody tty3 - Mon11pm 23:08m 0.22s 0.02s telnet dragon
woody pts/0 woody 10:36pm 0.00s 0.05s 0.02s w
/var/log/lastlog
(or /var/adm/lastlog in some kind of UNIX)
記錄檔功能:記錄系統中每一位使用者最近一次login系統的資訊。
檔案內容查閱指令:
lastlog命令會讀出 /var/log/lastlog 內的資訊,顯示每個帳號最近一次登入的時間。
實際使用例子:
[root@test /]# lastlog
Username Port From
Latest
root tty1
Tue Oct 10 18:06:20 +0800 2005
bin
**Never logged in**
...中間省略...
s88 tty2
test Mon
Oct 11 14:18:49 +0800 2005
syslogd相關系統記錄檔
syslogd的運作
/etc/syslog.conf是syslogd運作的關鍵,經由適當的設定,syslogd可以把相關應用程式的指定事件,寫入特定檔案之中,供管理與系統追蹤之用。Syslogd除了可以記錄系統事件之外,
使用者自行開發的程式運作記錄,也可以經由系統呼叫(System
Call),交給syslogd來分類處理。
/etc/syslog.conf內容的任何更動都必須重新啟動syslogd,以使得更改的內容生效。
/etc/syslog.conf的內容及設定
格式: SELECTOR ACTION
/etc/syslog.conf中每一行均包含兩個欄位,一為『SELECTOR』,一為『ACTION』。以『#』的為說明行,不起任何作用。這一行的意義是:當符合『SELECTOR』的事件發生時,採取『ACTION』所指定之方式記錄此一事件。
SELECTORS:
SELECTOR = facility.priority
priority是事件的優先等級,一般分成八個不同的等級,依優先順序由低至高分別為:
debug --> info --> notice --> warning(=warn) --> error(=err) --> crit
--> alert --> emerg(=panic)。
emerg: Emergency condition, 例如系統幾乎要當機了,
usually broadcast to all users
alert: Condition that should be corrected
immediately, such as a corrupted system database
crit: Critical condition, such
as a hardware error
err: Ordinary error
warning: Warning
notice: Condition that is not an error, but
possibly should be handled in a special way
info: Informational message
debug: Messages that are used when debugging
programs
Facility是產生事件的子系統(subsystem),syslog.conf中用來描素事件產生子系統的關鍵字。這些子系統包括系統內定或是使用者(Programmer)自行設定者。UNIX系統內定facility包括auth、auth-priv、cron、daemon、kern、lpr、mail、mark、news、security(=auth)、syslog、user、uucp等。這些facility所代表的程式,隨著UNIX系統種類的不同,會有一些不同,但通常是大同小異。以下是facility的 意義:
syslog將系統做適當的分類, 而且也對事件做不同等級的區隔, 有助於管理者將記錄訊息做分類檢索。
SELECTOR的寫法如下面的例子:
mail.notice
將包含mail
facility所產生的notice、warn、err、crit、alert及panic的事件訊息。
至於實際上什麼樣的事件該歸屬於哪一個facility的哪一個priority,則會隨UNIX與syslog程式的不同,而有小幅度的差異。例如tcpd的訊息在Sun
Solaris系統中,屬於mail.info,在Slackware Linux中屬於auth.info,RedHat Linux則是屬auth_priv.info。這些差異有時候需要管理者
花一些時間去找出來,可以查詢source code或詳細的文件說明(但一般沒有, 只有實際測試, 才能知道詳細差別)。
ACTION:
ACTION這個欄位描述syslogd會將符合該行中SELECTOR條件的訊息,記錄於何處。通常情況下,ACTION是一個存在於系統中的檔案(若檔案不存在,syslogd啟動時會自動產生),但是也可能是一個存在遠端主機的檔案、一個終端機(tty)或使用者login系統的虛擬終端機。一般而言ACTION所描述的可以是:
一般檔案(Regular File):
syslogd會將相關訊息記錄在這個檔案中。這個檔案必須以絕對路徑(以根目錄符號”/”起頭)方式描述,如果檔案不存在,在syslogd啟動,重新讀取/etc/syslog.conf時會自動產生。
終端機或是主控站(e.g. /dev/tty0 or /dev/console in Linux)
syslogd會將相關訊息直接由這個終端機或主控站的螢幕輸出。
使用者名稱(List of Users)
syslogd會將相關訊息直接由這些使用者遷入系統的終端機輸出,如果這個使用者當時(事件發生時)在線上的話。重要事件發生時(例如有人以su的方式成為root,或是重要程式當掉..等),為了時效通常會以這種方式,直接通知線上的管理者。所以此處所謂『使用者』通常指”root”。
所有線上使用者(with symbol “*”)
與上者相同,系統的緊急事件(例如系統關機),可以此種方式告知所有線上的使用者。
遠端主機名稱
此類事件的事件訊息會以會由本地的syslogd傳送給遠端主機的syslogd(使用 UDP Port 514),並由遠端主機決定如何處置
,遠端主機會依自己的設定來處理該事件(Treated as if its
Local)。當我們的機器故障會遭入侵時,通常本地系統日誌也會『屍骨無存』,這種方式可以讓你在系統故障時,依然可以透過存放於遠端主機的記錄檔進行原因判讀,並作為處理時的依據。
遠端主機的syslogd必須以”-r”的參數啟動,才會處理這類的syslog請求。
一些/etc/syslog.conf的例子
Example 1.
/etc/syslog.conf內容
# Store critical stuff in critical
#
*.=crit;kern.none /var/adm/critical
這裡使用特殊符號『=』及代表除外的priority『none』。『=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
#
kern.* /var/adm/kernel
kern.crit @finlandia
kern.crit /dev/console
kern.info;kern.!err /var/adm/kernel-info
1.
將所有『kern』facility相關messages記錄至/var/adm/kernel。
2.
將『kern.crit』、『kern.alert』及『kern.emerg』相關訊息,送至遠端主機finlandia記錄。(priority比crit高的訊息有alert及emerg)。
3. 將『kern.crit』、『kern.alert』及『kern.emerg』相關訊息傳送到系統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終端機的螢幕作即時的輸出。
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事件發生時的相關訊息,送至線上每一個使用者的終端機輸出。
系統記錄與管理
UNIX的系統日誌範圍涵括帳號簽入、指令使用、系統及應用程式運作等重要訊息,所謂『鑒往知來』,管理者必須能夠熟練的運用這些系統歷史,才能夠對系統作最適當的性能調整,並使系統保持一個最佳的狀態。UNIX的系統記錄至少可以在以下三點,協助管理者
執行管理工作:
安全查核(Security
Checking)
網路入侵事件頻傳,UNIX是一個多人多工系統,『何人、何時、做過何事』平常是個人隱私,管理者必須負責保守;可是當系統發生不當或違反規定的使用時,管理者必須藉助系統日誌,查明真相,釐清並追究相關責任。系統運作的安全問題通常來自使用者,雖然系統日誌並不能防止使用者不當使用系統,但是追查的能力,類似法律,具有嚇止、追究責任的功能,同時並可以據此擬定一個更嚴謹的安全政策(security
policy),確保系統的安全。
系統組態除錯(Configuration Debug)
『人有失手、馬有亂蹄』,管理者面對眾多系統功能與應用程式,各項參數調整,難免會有不當之處;系統日誌可以幫你記錄來自系統或應用程式的警告(warning)或錯誤訊息,據此管理者可以輕易的了解問題所在,對症下藥,正確的將系統調整在一個正確、適當服務組態下,繼續提供服務。
系統性能評估與擴充規劃(Performance Scheduling)
身為一個管理者,你如何幫你的系統擴充?該擴充什麼?什麼時候該擴充?回答這些問題前,你必須了解你的系統瓶頸何在。例如你的系統一天到晚跟你Complain
“Swap Space不足”,或是系統顯示過多的Page
in-out,那就是你擴充記憶體的時候了。這些系統健康狀況,通常可以在系統記錄檔中瞧見端倪。
除此之外,從你的系統與應用程式日誌,你可以對存取你系統服務的歷程有所了解,並對系統效能進行軟體微調(Performance
Tuning),確保系統常保於最佳狀況。
使用UNIX系統日誌該注意之事項
系統日誌利用檔案記錄方式,保留系統運作歷史,善加利用,對於幫助管理者掌握系統狀況注意不少,然而在這過程中,有些細節仍值得管理者注意,否則將是事倍功半,甚至適得其反。
系統事件記錄檔適當的分門別類
系統可記錄事件多如牛毛,管理者應適當的調整/etc/syslog.conf及相關應用程式的記錄設定檔。相同或相近的事件最好放在同一檔案之中,如此不僅可方便管理,管理者也可以在最短的時間內,找到想要查詢的訊息。
慎選日誌檔所在檔案系統位置
除了瞭解日誌記錄檔案位置之外,你也該為這些記錄檔找一個合適的家。除了上述的syslogd外,幾乎所有的應用程式都可以讓你指定儲放記錄檔的位置。良好的習慣包括:集中固定位置擺放、避免與
核心系統檔案放在同一分割、善用遠端主機記錄等。
定時清除及備份日誌檔
日誌檔是會長大的,而且有些是以我們想像不到的速度成長著。例如mail log (messages),user commands log (pacct)等檔案,極有可能以每天數MB的速度增長。太大的記錄不僅影響日誌機制運作效能,更有可能在最不應該發生的時候,撐破你的系統檔案系統,甚至使系統服務癱瘓。
通常日誌檔清除及備份這項工作,系統會以cron方式定時幫你完成,然而身為管理者的你,仍應隨時維持系統日誌檔的規模在於一個合理的規模。
結論
身為系統管理者,你是一個服務提供者(Service Provider),你需要知道你的Web
Server中網頁被存取的形態,以便作每一個網頁閱讀率的統計;你需要知道為什麼Email
Server為何在某個時段,總會『凸鎚』,信總是不容易寄進來;你必須知道在某一個時間點,到底有哪些人曾經做過檔案刪除的動作,以便處理一個使用者『檔案不明失蹤』案件;
如果系統被不當入侵時,你也應該能夠知道『誰』、『什麼時候』曾從『何處』進入系統,並『做了什麼事』。
諸如此類攸關系統管理的重要訊息,你都可以從系統的記錄檔,獲得重要的訊息;但是前提是,你了解他們,並且妥善的安排他們,否則你會發現,當你真正需要他們的時後,你不見得找得到,或者是,他們根本從未在你的系統存在過。
『系統管理』貴在『未雨綢繆』,你是管理者嗎?如果是的話,你該花一些時間,好好的看一看,並妥善安排你的系統記錄檔。