Syslogd的運作流程
為了能讓系統管理人員,清楚掌握系統的運作狀況,大多數的作業系統都會有日誌(Log)的功能,在 RHEL 3.0 系統中是由 sysklogd-1.4.1-12.i386.rpm 這個套件來負責此一功能的,在 Syslogd 系統中共有兩個 daemon,分別為 Syslogd 及 Klogd,如上圖所示,Kernel 所產生的 Log 將會交由 Klogd 來處理,Klogd 在交給 Syslogd 處理,而 AP 的部分可能會有兩種做法,一是將 Log 交由 Syslogd 處理,二是 AP 自行處理,如果是 AP 自行處理,那麼 AP 將自行將 Log 資訊儲存於 /var/log/ 目錄下的某個檔案 ,如果是交理 Syslogd 來處理,那麼 Syslogd 將會依照 /etc/syslog.conf 的內容來決定那些資訊該儲存於 /var/log/ 目錄下的那一個檔案。
Syslogd的基本組態
Syslogd 有兩個設定檔,分別是 /etc/sysconfig/syslog及 /etc/syslog.conf,如下所示:
/etc/sysconfig/syslog
# Options to syslogd # -m 0 disables 'MARK' messages. # -r enables logging from remote machines # -x disables DNS lookups on messages recieved with -r # See syslogd(8) for more details SYSLOGD_OPTIONS="-m 0"
|
在一般的使用下,鮮少需要更動這個檔案,除非有特殊的需求。
/etc/syslog.conf
# Log all kernel messages to the console.
# Log anything (except mail) of level info or higher.
# The authpriv file has restricted access.
# Log all the mail messages in one place.
# Log cron stuff
# Everybody gets emergency messages
# Save news errors of level crit and higher in a special file.
# Save boot messages also to boot.log
|
在這個設定檔中, 其語法如下:
類型.記錄等級 處理方式
「類型」可分為: | auth, authpriv, cron, daemon, kern, lpr, mail, mark, news, security (same as auth), syslog, user, uucp 及 local0 ~ local7,其中 local0~local7為使用者自訂類型,也可以使用 * 號來代表所有的類型。 |
「記錄等級」可分為: | debug, info, notice, warning, warn (same as warning), err, error (same as err), crit, alert, emerg, panic (same as emerg),以上各等級所記錄的資訊,由左至右遞減,但系統的緊急程度,由右至左遞減,也可以使用 none 表示全部不要。 |
「處理方式」可分為: | 存入檔案、終端機視窗、傳給線上的使用者或者傳遞至另外的Linux主機。 |
前端的 AP 可以自行定義其產生 Log 的「類型」及「記錄等級」,而 /etc/syslog.conf 檔案內則定義著,前端 AP 傳來的 Log 資訊其「類型」及「記錄等級」是什麼,再決定要儲存於何檔案內。
範例:
*.info ; mail.none ; authpriv.none ; cron.none /var/log/messages *.info :其中的 * 表示要記錄所有的「大項」, 而 . info表示要記錄 >= info 等級的所有資訊。 mail.none:其中的 mail 表示要記錄 mail 該項記錄,但後面的 .none 表示所有等級的資訊都不要。 所以這一行的意思是說:除了mail、authpriv及cron大項的資訊不需要, 其餘的類型中,大於等於info等級的資訊都要記錄到 /var/log/message這個檔案內 。 PS:請注意「類型」及「等級」之間的連結符號,共可分為 . .= .=! 及 .* 這四種, 其意義如下: . 代表 >= 的意思 .= 代表 = 的意思 .=! 代表 <> 的意思 .* 代表所有的意思 |
Log檔內的儲存格式
Syslogd 將系統資訊儲存於檔案,其檔案內的格式如下:
Sep 19 23:43:28 mail sshd[947]: Accepted password for root from 192.168.18.1 port 3287
其格式共分為四個欄位,分別如下:
Sep 19 23:43:28 | 記錄的時間 |
產生此 Log 的主機名稱 | |
sshd[947] | 產生此 Log 的應用程式名稱 |
Accepted password for root from 192.168.18.1 port 3287 | 此一 Log 的內容 |
使用者自定Log檔內容
由於 Syslogd 會將不同應用程式所產生的 log ,置於相同一個檔案內(如: /var/log/message 就集合了各種不同的 log),如果我們希望將某一個應用程式的 log, 獨立存放於一個檔案內,又該如何指定呢?
一般應用程式的設定檔,都可以指定 Log 輸出的 「類型」,以 sshd 為例,sshd 的設定檔為 /etc/ssh/sshd_config,其內容有一行為「SyslogFacility AUTHP,RIV」,表示 sshd 所產生的 log 將歸類為 AUTHPRIV 的類型,而 /etc/syslog.conf 檔案內指定將 AUTHPRIV 類型的資訊記錄於 /var/log/secure, 因此在預設定狀況下,sshd 所產生的 log 就存在於 /etc/log/secure內。
我們可以試著將 /etc/ssh/sshd_config 內的 「SyslogFacility AUTHPRIV」改為 「SyslogFacility local0」,也就是將 log 的類型改為 local0,並在 /etc/syslog.conf 檔案內加入一行「 local0.* /var/log/sshd」,接著請重新啟動 sshd 及 syslogd ,並試著使用 ssh 於遠端登入,此時 /var/log/ 內應該就會出現 sshd 這個 log 檔了。
組態Log Server及Log Client
如果 Server 眾多時,要管理分散於各地的 Log 也是一件苦差事,所幸 Syslog 系統本身就有 Client Server 的架構,只要經過簡單的組態,即可架構出 Log Server ,並將分散於各地的 Log 回存於 Log Server 之上,接下來就為各位示範 Log Server 及 Log Client 的組態。
Log Server
請修放 /etc/sysconfig/syslog 檔案,並將 「SYSLOGD_OPTIONS="-m 0"」改為「SYSLOGD_OPTIONS="-r -m 0"」,然後重新啟動 syslog 服務,如果 Log Server 有使用防火牆,那麼請記得將 udp 的 514 port 打開。
Log Client
請修改 /etc/syslog.conf ,例如原本存於本機內 /var/log/secure 的資訊,要傳回 Log Server 內存放,那麼請修改如下:
修改前:authpriv.* /var/log/secure | 修改後:authpriv.* @192.168.1.254 |
其中 @192.168.1.254 為 Log Server 的 IP,接著 Log Client 主機上,原本存於 /var/log/secure 檔案內的資訊,將會傳回給 Log Server ,而 Log Server 也將是依照 Log 的「類型」,將 log 資訊存放於 /var/log 內的某一個檔案。
也許你會有個疑問,如果有 10 個 Log Client,那 10 個 Log Client 的資訊都擠在 Log Server 的某一個檔案之中,不是更難管理嗎?
事實上一點也不會難以管理,別忘了 Log 格式中的第二個欄位為「產生此 Log 的主機名稱」,因此我們只要使用 grep 指令,並透過 hostname 來搜尋,即可快速分離各 Log Client 的 Log 資訊了。