從目前的情況來看,Syslog(系統日志)這一歷史悠久的日志系統仍舊占據著最主流的地位。由於與類 UNIX平台之間的淵源,Syslog是在實際應用環境中最容易獲得的日志系統。 同時,還有很多的基於Syslog的擴展產品存在,這其中也包括大量基於UNIX平台構建內核的網絡硬件設備,這些設備往往都內置了Syslog功能支 持,例如Cisco路由器就是如此。
一、 配置syslog守護進程
syslog是Linux系統默認的日志守護進 程。默認的syslog配置文件是/etc/syslog.conf文件。syslog守護進程是可配置的,它允許人們為每一種類型的系統信息精確地指定 一個存放地點。現在,我們先看看syslog.conf文件的配置行格式(這個文件裡的每一個配置行都是同樣的格式),然後再看一個完整的syslog配 置文件。syslog配置行的格式如下所示:
mail.*/var/log/mail
這一行由兩個部分組成。第一個部分是一個或多個“選擇條件”;上例中的選擇條件是“mail”。選擇條件後面跟一些空格字符,然後是一個“操作動作”;上例中的操作動作是:/var/log/mail
1選擇條件
選擇條件本身分為兩個字段,之間用一個小數點(.)分隔。前一字段是一項服務,後一字段是一個優先級。選擇條件其實是對消息類型的一種分類,這種分類便 於人們把不同類型的消息發送到不同的地方。在同一個syslog配置行上允許出現一個以上的選擇條件,但必須用分號(;)把它們分隔開。上面給出的例子裡 只有一個選擇條件“mail”。大家可以在我們後面給出的那個完整的syslog配置文件示例裡看到同時有多個選擇條件的配置行。
2 優先級
優先級是選擇條件的第二個字段,它代表消息的緊急程度。對一個應用程序來說,它發出的哪些消息屬於哪一種優先級是由 當初編寫它的程序員決定的,應用程序的使用者只能接受這樣的安排——除非打算重新編譯系統應用程序。表2按嚴重程度由低到高的順序列出了所有可能的優先 級。
不同的服務類型有不同的優先級,數值較大的優先級涵蓋數值較小的優先級。如果某個選擇條件只給出了一個優先級而沒有使用任何優先級限定符,對應於這個優 先級的消息以及所有更緊急的消息類型都將包括在內。比如說,如果某個選擇條件裡的優先級是“warning”,它實際上將把“warning”、 “err”、“crit”、“alert”和“emerg”都包括在內。
3優先級限定符
syslog允許人們使用三 種限定符對優先級進行修飾:星號(*)、等號(=)和歎號(!)。熟悉規則表達式的讀者應該對這三種限定符不會感到陌生。星號(*)的含義是“把本項服務 生成的所有日志消息都發送到操作動作指定的地點”。就像它在規則表達式裡的作用一樣,星號代表“任何東西”。在前面給出的例子裡,“mail.*”將把所 有優先級的消息都發送到操作動作指定的/var/log/mail文件裡。使用“*”限定符與使用“debug”優先級的效果完全一樣,後者也將把所有類 型的消息發送到指定地點。
等號(=)的含義是“只把本項服務生成的本優先級的日志消息都發送到操作動作指定的地點”。比如說,可以用“=”限定符只發送調試消息而不發送其他更緊急的消息(這將為應用程序減輕很多負擔)。當你只需要發送特定優先級別的消息時,就要使用等號限定符。
就像它在編程時的用法一樣,等號意味著等於且僅等於。歎號(!)的含義是“把本項服務生成的所有日志消息都發送到操作動作指定的地點,但本優先級的消息 不包括在內”。比如說,這條syslog配置行將把除info優先級以外的所有消息發送到/var/log/mail文件裡:
mail.*;mail.!info/var/log/mail
在這個例子裡,“mail.*”將發送所有的消息,但“mail.!info”卻把info優先級的消息排除在外。就像它在編程時的用法一樣,歎號意味著“非”。
4 操作動作
日志信息可以分別記錄到多個文件裡,還可以發送到命名管道、其他程序甚至另一台機器。syslog配置文件並不復雜,既容易閱讀又容易操作使用。這個文件裡的注釋都非常有用,應該好好讀讀它們。
二、 建立一個中央日志服務器
1建立中央日志服務器前的准備工作
配置良好的網絡服務(DNS和NTP)有助於提高日志記錄工作的精確性。在默認情況下,當有其他機器向自己發送日志消息時,中央日志服務器將嘗試解析該 機器的FQDN(fullyqualifieddomainname,完整域名)。(你可以在配置中央服務器時用“-x”選項禁止它這樣做。)如果 syslog守護進程無法解析出那個地址,它將繼續嘗試,這種毫無必要的額外負擔將大幅降低日志記錄工作的效率。類似地,如果你的各個系統在時間上不同 步,中央日志服務器給某個事件打上的時間戳就可能會與發送該事件的那台機器打上的時間戳不一致,這種差異會在你對事件進行排序分析時帶來很大的困擾;對網 絡時間進行同步有助於保證日志消息的時間准確性。如果想消除這種時間不同步帶來的麻煩,先編輯/etc/ntp.conf文件,使其指向一個中央時間源, 再安排ntpd守護進程隨系統開機啟動就可以了。
2配置一個中央日志服務器
只須稍加配置,就可以用syslog實現一個中央日志服務器。任何一台運行syslog守護進程的服務器都可以被配置成接受來自另一台機器的消息,但這 個選項在默認情況下是禁用的。在後面的討論裡,如無特別說明,有關步驟將適用於包括SUSE和RedHat在內的大多數Linux發行版本。我們先來看看 如何激活一個syslog服務器接受外來的日志消息:
1. 編輯/etc/sysconfig/syslog文件。
在“SYSLOGD_OPTIONS”行上加“-r”選項以允許接受外來日志消息。如果因為關於其他機器的DNS記錄項不夠齊全或其他原因不想讓中央日志 服務器解析其他機器的FQDN,還可以加上“-x”選項。此外,你或許還想把默認的時間戳標記消息(–MARK–)出現頻率改成比較有實際意義的數 值,比如240,表示每隔240分鐘(每天6次)在日志文件裡增加一行時間戳消息。日志文件裡的“–MARK–”消息可以讓你知道中央日志服務器上的 syslog守護進程沒有停工偷懶。按照上面這些解釋寫出來的配置行應該是如下所示的樣子:
SYSLOGD_OPTIONS=”-r-x-m240″
2.重新啟動syslog守護進程。修改只有在syslog守護進程重新啟動後才會生效。如果你只想重新啟動syslog守護進程而不是整個系統,在RedHat機器上,執行以下兩條命令之一:
/etc/rc.d/init.d/syslogstop;/etc/rc.d/init.d/syslogstart
/e
tc/rc.d/init.d/syslogrestart
3.如果這台機器上運行著iptables防火牆或TCPWrappers,請確保它們允許514號端口上的連接通過。syslog守護進程要用到514號端口。
4為中央日志服務器配置各客戶機器
讓客戶機把日志消息發往一個中央日志服務器並不困難。編輯客戶機上的/etc/syslog.conf文件,在有關配置行的操作動作部分用一個“@”字符指向中央日志服務器,如下所示:
authpriv.*@192.168.1.40
另一種辦法是在DNS裡定義一個名為“loghost”的機器,然後對客戶機的syslog配置文件做如下修改(這個辦法的好處是:當你把中央日志服務器換成另一台機器時,不用再修改每一個客戶機上的syslog配置文件):
authpriv.*@loghost
接下來,重新啟動客戶機上的syslog守護進程讓修改生效。讓客戶機在往中央日志服務器發送日志消息的同時繼續在本地進行日志工作仍有必要,起碼在調試客戶機的時候不必到中央日志服務器查日志,在中央日志服務器出問題的時候還可以幫助調試。
總結:日志系統承擔著整個信息基礎設施中感覺器官的作用,一個完善的、工作良好的體系需要在正確的地點部署日志采集工具。後邊筆者會介紹syslog的增強版本syslog-ng。
基本的一些概念:
1)syslog的日志為8個等級,從0到7,詳細的信息,man syslog就可以了.默認是info.
2)我們的系統日志在/var/log/下面,像messages,secure等等,這裡要說明的,不是你的操作系統就會寫入到對映的日志裡
也就是說只有想寫日志信息到裡面,要通過syslog系統函數來操作.
3)syslog日志系統提供遠程日志寫入功能,即A機器開放syslog的服務,並開放遠程syslog功能,B機器可以將自己的日志信息寫入到A機器的日志系統
4)syslog提供facility使用戶自定義的來操縱程序寫日志.
特殊玩法:
1)如何將消息寫入到syslog的日志系統?
可以用logger命令,syslog的日志等級有8個,默認是info,這時你用syslog為debug(最低)來寫日志,syslog服務是不會寫日志的.
比如:
cat /etc/syslog.conf
*.info;mail.none;authpriv.none;cron.none /var/log/messages
[root@umail180 etc]# logger -p debug “hello this is a test”
-p選項來指定優先級,logger的默認優先為是info.指定info或更高的優先級都可以被syslog所接收.
*.info;mail.none;authpriv.none;cron.none這裡的*表示所有的facility,而none表示對映的facility不被接收
2)如何將命令的執行結果寫入到syslog的日志系統?
可以用initlog命令.例如:
initlog -c “cat /etc/passwd”
-c選項後面要指定command
這時會把cat /etc/passwd的結果寫入到/var/log/message.
其中initlog在sysinit中就有調用,它記錄了整個sysinit腳本的啟動引導過程,這樣我們才會在messages裡看到它的引導信息
3)實現syslog的遠程寫日志功能.
服務端:
這裡要打開/etc/sysconfig/syslog文件
更改SYSLOGD_OPTIONS=”-m 0″
為SYSLOGD_OPTIONS=”-m 0 -r ”
重啟syslog服務即可,注意更改/etc/sysconfig/syslog和/etc/syslog都要重啟syslog服務,因為/etc/init.d/syslog腳本在啟動時要加載這兩個文件.
默認是開放514的udp端口
netstat -anp|grep syslog
udp 0 0 0.0.0.0:514 0.0.0.0:* 3425/syslogd
客戶端:
vi /etc/syslog.conf
增加一條策略,如下:
*.info @umail180
這裡的*代表所有的facility,也就是說所有的級別為info的寫日志操作都將寫入到遠程的umail180服務器,這裡的umail180是主機名
有兩點要重點說明:
第一點,寫本地syslog,和寫遠程的syslog是兩回事,相互不影響
例如: 你有兩條策略:
*.info /var/log/messages
*.info @umail180
它是即寫/var/log/messages,又寫umail180的syslog
說明 :系統是先接收到recv請求, 再去寫文件,然後調用fsync同步內存到磁盤.最後它調用sendto函數發送到192.168.7.178這台服務器的514端口
這時在服務端會收到請求.並寫到syslog指定facility的文件中.
第二點,syslog的服務端收到請求,會根據facility將信息寫到對映的文件中,這樣有利於信息的匯集和管理
例如:
在其它服務器登錄這台客戶端
當然這時本地的syslog會收到請求,會根據syslog.conf文件的facility將信息寫入到/var/log/secure中.
而如果你有也想將信息寫入到遠程服務器,例如采用下面的配置:
authpriv.* /var/log/secure
*.info @umail180
同樣遠程服務器將收到本地syslog的sendto請求,它將跟據請求的facility,寫入的對映的文件中.比如/var/log/secure
這時在遠程的/var/log/secure中也記錄了一份登錄客戶端的日志信息.
4)想記錄那些鳥人在我服務器上的所有操作,可以用syslog實現嗎?
答案是可以的.但要說明白似乎要走些彎彎.
首先並不是所有的操作都會寫入到日志中,即使你把級別調到最高也是如此
問題就在於,真正涉及到寫syslog的日志的操作,只能是調用syslog函數,而調用syslog函數的命令我們剛才見到兩個,logger和initlog
它們各有用處.像ls和cp這種命令是不會調用syslog函數,所以即使你將級別調整到debug,也是無用的.
那好.如何解決上面的問題,先說initlog,我在不調用initlog的情況下,能用syslog記錄它的運行結果嗎?
這樣就可以.
initlog -c /bin/bash
這時/var/log/message就記錄下它操作的結果.如果是rpm -qa,那就會有一大批的信息.
但遺憾的是,它會丟了PROMPT.就是PS1那一大堆東西.但所有的命令都有效.
再來說說logger.這裡有一點要區分,logger只是寫信息到syslog的日志中,它是不執行那些信息的.
這裡要執行命令,也要將命令寫到syslog中,再根據syslog的遠程功能,發送到遠端的syslog服務器.
在日志中將是這樣的結果:
Jun 2 16:12:52 umail180 bash[24371]: ls –color=tty -l
Jun 2 16:13:30 umail180 bash[24371]: hacker
Jun 2 16:13:40 umail180 bash[24371]: ls –color=tty
Jun 2 16:13:43 umail180 bash[24371]: cd /usr/src/
Jun 2 16:13:43 umail180 bash[24371]: ls –color=tty
Jun 2 16:13:46 umail180 bash[24371]: cd redhat/
Jun 2 16:13:47 umail180 bash[24371]: ls –color=tty
Jun 2 16:28:11 umail180 bash[24371]: cd SOURCES/
Jun 2 16:28:11 umail180 bash[24371]: ls –color=tty
Jun 2 16:
28:13 umail180 bash[24371]: ifconfig eth0
Jun 2 16:28:14 umail180 bash[24371]: ls –color=tty
Jun 2 16:28:15 umail180 bash[24371]: clear
這裡要改下bash的源程序:
簡單說下bash的運行流程:
主程序文件是shell.c,它會做一些profile中的設定,包括PS1等等,最後它會運行eval.c中的reader_loop函數,
這個函數接收這些操作指令.再調用execute_command函數執行之,當然它後面非常復雜,這裡只要把
這些指令接收進來,再調用syslog函數寫到syslog服務的日志中就OK了.至於後面怎麼執行,那不是我們關心的.
我改了兩個地方:
eval.c中的reader_loop函數,大概在143行插入了:print_to_syslog(current_command);
print_to_syslog是我自定義的函數.
這個函數,我加到了print_cmd.c源程序中.
如下:
print_to_syslog(command)
COMMAND *command;
{
command_string_index = 0;
openlog (“bash”, LOG_PID, LOG_LOCAL5);
syslog (LOG_INFO, “%s\n”, make_command_string(command));
closelog();
}
這裡的openlog的LOG_LOCAL5是facility,這個是在syslog.conf中自定義的.
這裡的syslog是系統函數,所以要在print_cmd.c文件中加入頭文件syslog.h.
把bash的源程序再./configure;make;make install就行了.
最後把想要監控的用戶的bash指定到新的bash文件就可以了.
例如在 syslog.conf中添加下面的樣子:
local5.* @umail180
在遠端的syslog服務器中添加和上面對映的就行了.
local5.* /var/log/operator
呵呵.這樣你就可以坐在電腦前看著/var/log/operator,欣賞所有服務器上操作者的表演了.
有關於概念上的學習,man查看下syslog和syslog.conf,還有 openlog
這些都是很有用的.