syslog 系統日誌應用
1) 概述
syslog是Linux系統默認的日誌守護進程。默認的syslog配置文件是/etc/syslog.conf文件。程序,守護進程和內核提供了訪問系統的日誌信息。所以,任何但願生成日誌信息的程序均可以向 syslog 接口呼叫生成該信息。
幾乎全部的網絡設備均可以經過syslog協議,將日誌信息以用戶數據報協議(UDP)方式傳送到遠端服務器,遠端接收日誌服務器必須經過syslogd監聽UDP 端口514,並根據 syslog.conf配置文件中的配置處理本機,接收訪問系統的日誌信息,把指定的事件寫入特定文件中,供後臺數據庫管理和響應之用。意味着可讓任何事件都登陸到一臺或多臺服務器上,以備後臺數據庫用off-line(離線) 方法分析遠端設備的事件。
一般,syslog 接受來自系統的各類功能的信息,每一個信息都包括重要級。/etc/syslog.conf 文件通知 syslogd 如何根據設備和信息重要級別來報告信息。linux
2) etc/syslog.conf
/etc/syslog.conf 文件使用下面的格式:
facility.level action
facility.level爲選擇條件自己分爲兩個字段,之間用一個小數點(.)分隔。action和facility.level之間使用TAB隔開。前一字段是一項服務,後一字段是一個優先級。選擇條件實際上是對消息類型的一種分類,這種分類便於人們把不一樣類型的消息發送到不一樣的地方。在同一個syslog配置行上容許出現一個以上的選擇條件,但必須用分號(;)把它們分隔開。action字段所表示的活動具備許多靈活性,特別是,可使用名稱管道的做用是可使 syslogd 生成後處理信息。
要素分析:
facility 指定 syslog 功能,主要包括如下這些:
kern 內核信息,首先經過 klogd 傳遞;
user 用戶進程;
mail 郵件;
daemon 後臺進程;
authpriv 受權信息;
syslog 系統日誌;
lpr 打印信息;
news 新聞組信息;
uucp 由uucp生成的信息
cron 計劃和任務信息。
mark syslog 內部功能用於生成時間戳
local0----local7 與自定義程序使用,例如使用 local5 作爲 ssh 功能
* 通配符表明除了 mark 之外的全部功能數據庫
level 指定syslog優先級:
syslog 級別以下:(按嚴重程度由高到低的順序列出了全部可能的優先級。)
emerg 或 panic 該系統不可用(最緊急消息)
alert 須要當即被修改的條件(緊急消息)
crit 阻止某些工具或子系統功能實現的錯誤條件(重要消息)
err 阻止工具或某些子系統部分功能實現的錯誤條件(出錯消息)
warning 預警信息(警告消息)
notice 具備重要性的普通條件(普通但重要的消息)
info 提供信息的消息(通知性消息)
debug 不包含函數條件或問題的其餘信息(調試級-信息量最多)
none 沒有重要級,一般用於排錯(不記錄任何日誌消息)
* 全部級別,除了none服務器
action:網絡
1. /var/log/lastlog : 記錄每一個使用者最近簽入系統的時間, 所以當使用者簽入時, 就會顯示其上次簽入的時間, 您應該注意一下這個時間, 若不是您上次簽入的時間, 表示您的賬號可能被人盜用了. 此檔可用 /usr/bin/lastlog 指令讀取.
2. /var/run/utmp : 記錄每一個使用者簽入系統的時間, who, users, finger 等指令會查這個檔案.
3. /var/log/wtmp : 記錄每一個使用者簽入及簽出的時間, last 這個指令會查這個檔案. 這個檔案也記錄 shutdown 及 reboot 的動做.
4. /var/log/secure : 登陸系統的信息app
5. /var/log/maillog : 記錄 sendmail 及 pop 等相關訊息.
6. /var/log/cron : 記錄 crontab 的相關訊息 ,定時器的信息
7. /var/log/dmesg : /bin/dmesg 會將這個檔案顯示出來, 它是開機時的畫面訊息.
8. /var/log/xferlog : 記錄那些位址來 ftp 拿取那些檔案.
9. /var/log/messages : 系統大部份的訊息皆記錄在此, 包括 login, check password , failed login, ftp, su 等.
Application 中定義level:
0: LOG_EMERG,緊急狀況
1: LOG_ALERT,高優先級故障,例如數據庫崩潰
2: LOG_CRIT,嚴重錯誤,例如硬件故障
3: LOG_ERR,錯誤
4: LOG_WARNING,警告
5: LOG_NOTICE,須要注意的特殊狀況
6: LOG_INFO,通常信息
7: LOG_DEBUG,調試信息
kernel中定義level(使用printk函數設定level):
0: KERN_EMERG, 系統無法使用
1: KERN_ALERT, 必須當即執行
2: KERN_CRIT, 緊急狀態
3: KERN_ERR, 錯誤狀態
4: KERN_WARNING, 警告狀態
5: KERN_NOTICE, 正常狀態且十分重要
6: KERN_INFO, 報告
7: KERN_DEBUG, debug-level訊息ssh
例子:ide
//其中*是通配符,表明任何設備;none表示不對任何級別的信息進行記錄。函數
*.info;mail.none;news.none;authpriv.none;cron.none /var/log/messages工具
//將authpriv的任何級別的信息記錄到/var/log/secure文件中,這主要是一些和認、權限使用相關的信息。性能
authpriv.* /var/log/secure
//將mail設備中的任何級別的信息記錄到/var/log/maillog文件中,這主要是和電子郵件相關的信息。
mail.* -/var/log/maillog
//將cron設備中的任何級別的信息記錄到/var/log/cron文件中,這主要是和系統中按期執行的任務相關的信息。
cron.* /var/log/cron
//將任何設備的emerg級別的信息發送給全部正在系統上的用戶。
*.emerg *
//將uucp和news設備的crit級別的信息記錄到/var/log/spooler文件中。
uucp,news.crit /var/log/spooler
//將和系統啓動相關的信息記錄到/var/log/boot.log文件中。
local7.* /var/log/boot.log
「mail.*」將發送全部的消息,「mail.!info」把info優先級的消息排除在外。
mail.*;mail.!info /var/log/mail
下面的規則指定Facility爲mail,Severity爲err以上級別的日誌寫入/var/log/mail.err文件,而err如下級別的日誌則被忽略:
mail.err /var/log/mail.err
facility和level可使用通配符,也能夠指定多個,用逗號隔開:
auth,authpriv.* /var/log/auth.log
Facility和level的組合能夠有多個,用分號隔開,文件前面加一個減號表示日誌不當即寫入文件,而是在緩衝中積攢到必定的條件再寫,這樣 能夠提升性能,可是當機可能會丟失數據:
*.*;auth,authpriv.none -/var/log/syslog
能夠把syslog消息經過UDP發送到syslog服務器的514端口:
*.err @192.168.0.1
發生錯誤時,在控制檯打屏:
*.err /dev/console
linux日誌管理:
內核信息 -> klogd -> syslogd -> /var/log/messages等文件
其餘信息 -> syslogd -> /var/log/messages等文件
syslog配置文件 -> /etc/syslog.conf
3) 調用 syslogd 守護程序
syslog 守護程序是由 /etc/rc.d/init.d/syslog 腳本在運行級2下被調用的,缺省不使用選項。但有兩個選項 -r 和 -h 頗有用。
若是將要使用一個日誌服務器,必須調用 syslogd -r。缺省狀況下 syslog 不接受來自遠程系統的信息。當指定 -r 選項,syslogd 將會監遵從 514 端口上進來的 UDP 包。
若是還但願日誌服務器能傳送日誌信息,可使用 -h 標誌。缺省時,syslogd 將忽略使其從一個遠程系統傳送日誌信息到另外一個系統的/etc/syslog.conf 輸入項。
4) klogd 守護進程
klogd 守護進程得到並記錄 Linux 內核信息。一般,syslogd 會記錄 klogd 傳來的全部信息,然而,若是調用帶有 -f filename 變量的 klogd 時,klogd 就在 filename 中記錄全部信息,而不是傳給syslogd。當指定另一個文件進行日誌記錄時,klogd 就向該文件中寫入全部級別或優先權。Klogd 中沒有和 /etc/syslog.conf 相似的配置文件。使用 klogd 而避免使用 syslogd 的好處在於能夠查找大量錯誤。若是有人***了內核,使用 klogd 能夠修改錯誤。
5) 配置一箇中央日誌服務器
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守護進程而不是整個系統,執行如下兩條命令之一:
/etc/rc.d/init.d/syslog stop; /etc/rc.d/init.d/syslog start
/etc/rc.d/init.d/syslog restart
3. 若是這臺機器上運行着iptables防火牆或TCPWrappers,請確保它們容許514號端口上的鏈接經過。syslog守護進程要用到514號端口。
4. 爲中央日誌服務器配置各客戶機器
讓客戶機把日誌消息發往一箇中央日誌服務器並不困難。編輯客戶機上的/etc/syslog.conf文件,在有關配置行的操做動做部分用一個「@」字符指向中央日誌服務器,以下所示:
authpriv.*@192.168.1.40
另外一種辦法是在DNS裏定義一個名爲「loghost」的機器,而後對客戶機的syslog配置文件作以下修改(這個辦法的好處是:當你把中央日誌服務器換成另外一臺機器時,不用再修改每個客戶機上的syslog配置文件)
authpriv.*@loghost
接下來,從新啓動客戶機上的syslog守護進程讓修改生效。讓客戶機在往中央日誌服務器發送日誌消息的同時繼續在本地進行日誌工做仍有必要,起碼在調試客戶機的時候沒必要到中央日誌服務器查日誌,在中央日誌服務器出問題的時候還能夠幫助調試。
6)與系統日誌相關的函數:
openlog, syslog, closelog是一套系統日誌寫入接口。
程序的用法示例代碼以下:syslog.c
[c-sharp] view plaincopyprint?
//syslog.c
#include <syslog.h>
int main(int argc, char **argv)
{
openlog("MyMsgMARK", LOG_CONS | LOG_PID, 0);
syslog(LOG_EMERG,
"This is a syslog test message generated by program '%s'/n",
argv[0]);
closelog();
return 0;
}
編譯運行:
[root@localhost liuxltest]# gcc -o syslog syslog.c
[root@localhost liuxltest]# ./syslog
[root@localhost liuxltest]#
Message from syslogd@ at Tue Feb 24 13:24:34 2009 ...
localhost MyMsgMARK[16467]: This is a syslog test message generated by program './syslog'
同時,你也能夠在/var/log/messages中看到信息以下:
Feb 24 13:24:34 localhost MyMsgMARK[16467]: This is a syslog test message generated by program './syslog'
函數說明:
openlog函數原型以下:
void openlog(const char *ident, int option, int facility);
此函數用來打開一個到系統日誌記錄程序的鏈接,打開以後就能夠用syslog或vsyslog函數向系統日誌裏添加信息了。
參數說明:
ident:是一個標記,ident所表示的字符串將固定地加在每行日誌的前面以標識這個日誌,一般就寫成當前程序的名稱以做標記。
option:是下列值取與運算的結果:LOG_CONS, LOG_NDELAY, LOG_NOWAIT, LOG_ODELAY,
LOG_PERROR, LOG_PID,各值意義請參考man openlog手冊: LOG_CONS Write directly to system console if there is an error while sending to system logger. LOG_NDELAY Open the connection immediately (normally, the connection is opened when the first message is logged). LOG_PERROR (Not in SUSv3.) Print to stderr as well. LOG_PID Include PID with each message. facility:指明記錄日誌的程序的類型。closelog函數原型以下:void closelog(void ) 此函數就是用來關閉openlog打開的鏈接的。syslog函數原型以下: void syslog(int priority, const char *format, ...); 此函數用於把日誌消息發給系統程序syslogd去記錄。 參數說明: priority:是消息的緊急級別; format:是消息的格式,以後是格式對應的參數。就是printf函數同樣使用。應用: 若是咱們的程序要使用系統日誌功能,只須要在程序啓動時使用openlog函數來鏈接syslogd程序,後面隨時用syslog函數寫日誌就好了。 另外,做爲syslog的替代程序的新一代工具是syslog-ng,syslog-ng具備很強的網絡功能,能夠方便地把多臺機器上的日誌保存到一臺中心日誌服務器上。