system log
首頁

bullet

前 言

『欲知過去事,請看系統日誌』。伺服器的運作通常是全年無休,24小時運轉。UNIX作業系統的系統日誌(System log)忠實的幫你記錄系統中任何時間所發生的大小事件。一個管理者除了每天必須查看系統記錄,隨時掌握系統健康狀況之外,應該還要了解系統日誌運作原理,並且能夠依照本身需求,打造一個為自己量身而作的系統記錄環境,靈活運用系統日誌,提供更穩定的電腦使用環境。

本文介紹UNIX作業系統的記錄檔案(System Log)機制,針對syslog.conf說明系統日誌環境的設定,並對系統日誌的使用與管理提出一些應該注意事項。


bullet

UNIX作業系統的系統記錄

UNIX是一個多人多工的作業系統,系統記錄檔記錄著著個系統中所發生事件的人、事、時、地、物等相關訊息,藉由這些訊息,管理者可以了解到系統已顯現或潛藏的問題所在,並據此做出決策,以解決或預防此類事件影響系統正常運作。

UNIX上的系統記錄,基本上可以分成三類:
一、 syslogd無關系統記錄:如wtmp、utmp、lastlog、pacct等。
二、 syslogd相關系統記錄檔: messages、syslog及管理者所設定之檔案。
三、 應用程式運作記錄檔: 如Apache Server的access.log及error.log等。

syslogd是UNIX中負責記錄『大部分』系統事件(event)的一個背景程式(daemon),syslogd可以經由設定與設計,記錄包括核心、系統程式及使用者自行開發程式的運作情形及所發生的事件。另外,系統核心本身也記錄了一些與使用者帳號存取有關的訊息,這些是與syslogd這個程式無關的。除此之外,UNIX中的應用程式,如Web Server,本身也會提供類似的記錄,管理者必須了解,但這不在本文探討範圍。

系統的記錄一般以純文字或特殊格式的方式記錄於檔案中。前者的訊息可以用任何文字編輯緝查閱,上述第二類及大部分的第三類記錄檔屬之;後者則必須透過特殊程式查詢,上述第一類記錄檔屬之。以下針對第一類及第二類的記錄檔作功能性的描述。本文所有例子均以RedHat Linux 6.0為例,其他版本UNIX會有一些小差異。

bullet

Syslogd無關系統記錄檔
bullet

/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@dragon1 log]# 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

bullet

 /var/log/utmp (or /var/adm/utmp in some kind of UNIX)

記錄檔功能:記錄目前登入系統使用者(仍在線上)資訊。包括使用者名稱、使用tty、login系統時間、由何處login系統、使用CPU狀況及目前正在執行之程式。
檔案內容查閱指令:w 、who

實際使用例子:
[woody@dragon1 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

bullet

 /var/log/lastlog (or /var/adm/lastlog in some kind of UNIX)

記錄檔功能:記錄系統中每一位使用者最近一次login系統的資訊。
檔案內容查閱指令:finger,另外使用者完成login程序之後,這個檔案也會被讀取,並告知使用者上次login時間。

實際使用例子:
[woody1@dragon1 ~]$ finger woody@localhost
[localhost]
Login: woody Name: Woody WU
Directory: /users/staff/woody Shell: /bin/bash
On since Mon Jan 17 23:26 (CST) on tty3 23 hours 18 minutes idle
Last login Tue Jan 18 22:36 (CST) on 0 from woody
No mail.

bullet

 /var/log/pact (or /var/adm/pact in some kind of UNIX)

記錄檔功能:記錄系統中指令執行的資訊。例如何人、何時執行哪一隻程式,共計使用多少CPU時間。
檔案內容查閱指令:lastcomm (activated by “accton /var/log/pact”)

實際使用例子:
[root@dragon1 log]# lastcomm|more
in.telnetd S root ?? 0.02 secs Tue Jan 18 10:52
login S root ?? 0.03 secs Tue Jan 18 10:52
bash S woody ?? 0.04 secs Tue Jan 18 10:52
clear woody ?? 0.00 secs Tue Jan 18 10:52
more woody ?? 0.01 secs Tue Jan 18 10:52
lastcomm woody ?? 0.00 secs Tue Jan 18 10:52
grep woody ?? 0.00 secs Tue Jan 18 10:52
bash F woody ?? 0.00 secs Tue Jan 18 10:52
bash F woody ?? 0.00 secs Tue Jan 18 10:52
hostname woody ?? 0.00 secs Tue Jan 18 10:52
bash F woody ?? 0.00 secs Tue Jan 18 10:52

bullet

syslogd相關系統記錄檔
bullet

syslogd的運作
/etc/syslog.conf是syslogd運作的關鍵,經由適當的設定,syslogd可以把相關應用程式的指定事件,寫入特定檔案之中,供管理與系統追蹤之用。Syslogd除了可以記錄系統事件之外,經由系統呼叫(System Call),使用者自行開發的程式運作記錄,也可以由syslogd代勞!

/etc/syslog.conf內容的任何更動都必須重新啟動syslogd,以使得更改的內容生效。

 
bullet

 /etc/syslog.conf的內容及設定

格式: SELECTOR ACTION
/etc/syslog.conf中每一行均包含兩個欄位,一為『SELECTOR』,一為『ACTION』。以『#』的為說明行,不起任何作用。這一行的意義是:當符合『SELECTOR』的事件發生時,採取『ACTION』所指定之方式記錄此一事件。
bullet

SELECTORS:

SELECTOR = facility.priority

Priority是事件的優先等級。一般而言,syslogd將系統事件分成八個不同的等級,依優先順序低至高分別為:

debug  --> info --> notice --> warning(=warn) --> error(=err) --> crit --> alert --> emerg(=panic)。

Facility是產生事件的子系統(subsystem),syslog.conf中用來描素事件產生子系統的關鍵字。這些子系統包括系統內定或是使用者(Programmer)自行設定者。UNIX系統內定facility包括auth、auth-priv、cron、daemon、kern、lpr、mail、mark、news、security(=auth)、syslog、user、uucp,使用者自行開發之程式則可使用local1 ~ local7。這些facility所代表的程式,隨著UNIX系統種類的不同,會有一些不同,但通常是大同小異。以下是一些較重要facility所的定義通則:

auth 使用者簽入認證(authentication)
kern 核心(kernel)運作
mail 電子郵件(Email System)運作
lpr 印表系統
daemon System Server Process(yp、nfsd….)

須注意的是所有高於或等於SELECTOR中指定的priority事件所產生的訊息,都將會被syslogd依據對應ACTION的指定方式,記錄在系統中。例如mail.notice包含了mail facility所產的notice、warn、err、crit、alert及panic的事件訊息。

至於實際上什麼樣的事件該歸屬於哪一個facility的哪一個priority,則會隨UNIX種類的不同,而有小幅度的差異。例如tcpd的訊息在Sun Solaris系統中,屬於mail.info,在Slackware Linux中屬於auth.info,RedHat Linux則是屬auth_priv.info。這些差異有時候需要管理者花一些時間去找出來。

bullet

 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(With UDP Port #514),並由遠端主機決定如何處置(Traeted as if its Local)。當我們的機器故障會遭入侵時,通常本地系統日誌也會『屍骨無存』,這種方式可以讓你在系統故障時,依然可以透過存放於遠端主機的記錄檔進行原因判讀,並作為處理時的依據。

當然這種方式所需付出的代價為網路頻寬,及系統處理Networking Inter-Processing所需的CPU時間。通常我們僅會用這種方式處理緊急(panic 或 err)的事件發生時的訊息記錄。

以Linux為例,遠端主機的syslogd必須以”-r”的參數啟動,才會處理這類的syslog請求。

bullet

一些/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事件發生時的相關訊息(例如系統關機),送至當時線上每一個使用者的終端機輸出,用以通知線上的使用者。


bullet

系統記錄與管理

UNIX的系統日誌範圍涵括帳號簽入、指令使用、系統及應用程式運作等重要訊息,所謂『鑒來知往』,管理者必須能夠熟練的運用這些『系統歷史』,才能夠對系統作最有建設性的前瞻,做最適當的性能調整,並使系統保持一個最佳的狀態。UNIX的系統記錄至少可以在以下三點,協助管理者將管理工作作的更臻完備:
bullet

安全查核(Security Checking)
網路入侵事件頻傳,UNIX是一個多人多工系統,『何人、何時、做過何事』平常是個人隱私,管理者必須負責保守;可是當系統發生不當或違反規定的使用時,管理者必須藉助系統日誌,查明真相,釐清並追究相關責任。系統運作的安全問題通常來自使用者,雖然系統日誌並不能防止使用者不當使用系統,但是追查的能力,類似法律,具有嚇止、追究責任的功能,同時並可以據此擬定一個更嚴謹的安全政策(security policy),確保系統的安全。

bullet

系統組態除錯(Configuration Debug)
『人有失手、馬有亂蹄』,管理者面對眾多系統功能與應用程式,各項參數調整,難免會有不當之處;系統日誌可以幫你記錄來自系統或應用程式的警告(warning)或錯誤訊息,據此管理者可以輕易的了解問題所在,對症下藥,正確的將系統調整在一個正確、適當服務組態下,繼續提供服務。

bullet

系統性能評估與擴充規劃(Performance Scheduling)
身為一個管理者,你如何幫你的系統擴充?該擴充什麼?什麼時候該擴充?回答這些問題前,你必須了解你的系統瓶頸何在。例如你的系統一天到晚跟你Complain “Swap Space不足”,或是系統顯示過多的Page in-out,那就是你擴充記憶體的時候了。這些系統健康狀況,通常可以在系統記錄檔中瞧見端倪。
除此之外,從你的系統與應用程式日誌,你可以對存取你系統服務的歷程有所了解,並對系統效能進行軟體微調(Performance Tuning),確保系統常保於最佳狀況。

 

bullet

使用UNIX系統日誌該注意之事項

系統日誌利用檔案記錄方式,保留系統運作歷史,善加利用,對於幫助管理者掌握系統狀況注意不少,然而在這過程中,有些細節仍值得管理者注意,否則將是事倍功半,甚至適得其反。
bullet

系統事件記錄檔適當的分門別類
系統可記錄事件多如牛毛,管理者應適當的調整/etc/syslog.conf及相關應用程式的記錄設定檔。相同或相近的事件最好放在同一檔案之中,如此不僅可方便管理,管理者也可以在最短的時間內,找到想要查詢的訊息。

bullet

慎選日誌檔所在檔案系統位置
除了瞭解日誌記錄檔案位置之外,你也該為這些記錄檔找一個合適的家。除了上述的syslogd外,幾乎所有的應用程式都可以讓你指定儲放記錄檔的位置。良好的習慣包括:集中固定位置擺放、避免與系統檔案同一檔案系統、善用遠端主機記錄等。

bullet

定時清除及備份日誌檔
日誌檔是會長大的,而且有些是以我們想像不到的速度成長著。例如mail log (messages),user commands log (pacct)等檔案,極有可能以每天數MB的速度增長。太大的記錄不僅影響日誌機制運作效能,更有可能在最不應該發生的時候,撐破你的系統檔案系統,甚至使系統服務癱瘓。
通常日誌檔清除及備份這項工作,系統會以cron方式定時幫你完成,然而身為管理者的你,仍應隨時維持系統日誌檔的規模在於一個合理的規模。『別讓本該載舟的水弄翻了你的船』。(水能載舟,亦能覆舟是也!)


bullet

結論

身為系統管理者,你是一個服務提供者(Service Provider),你可能需要知道你的Web Server中網頁被存取的形態,以便作每一個網頁閱讀率的統計;你可能想知道為什麼Email Server為何在某個時段,總會『凸鎚』,信總是不容易寄進來;你可能必須知道在某一個時間點,到底有哪些人曾經做過檔案刪除的動作,以便處理一個使用者『檔案不明失蹤』案件;忽然發現系統『不幸』可能被不當使用時(入侵)時,你也可能想知道『誰』、『什麼時候』曾從『何處』進入系統,並『做了什麼事』。

諸如此類攸關系統管理的重要訊息,你都可以從系統的記錄檔,獲得重要的訊息;但是前提是,你了解他們,並且妥善的安排他們,否則你會發現,當你真正需要他們的時後,你不見得找得到,或者是,他們根本從未在你的系統存在過。

『系統管理』貴在『未雨綢繆』,你是管理者嗎?如果是的話,你該花一些時間,好好的看一看,並妥善安排你的你的系統記錄檔!