linux下syslog使用說明

syslog 系統日誌應用
 1) 概述
      syslog是Linux系統默認的日誌守護進程。默認的syslog配置文件是/etc/syslog.conf文件。程序,守護進程和內核提供了訪問系統的日誌信息。因此,任何希望生成日誌信息的程序都可以向 syslog 接口呼叫生成該信息。
      幾乎所有的網絡設備都可以通過syslog協議,將日誌信息以用戶數據報協議(UDP)方式傳送到遠端服務器,遠端接收日誌服務器必須通過syslogd監聽UDP 端口514,並根據 syslog.conf配置文件中的配置處理本機,接收訪問系統的日誌信息,把指定的事件寫入特定文件中,供後臺數據庫管理和響應之用。意味着可以讓任何事件都登錄到一臺或多臺服務器上,以備後臺數據庫用off-line(離線) 方法分析遠端設備的事件。
      通常,syslog 接受來自系統的各種功能的信息,每個信息都包括重要級。/etc/syslog.conf 文件通知 syslogd 如何根據設備和信息重要級別來報告信息。

 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 : 登錄系統的信息


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訊息

例子:

//其中*是通配符,代表任何設備;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?

  1. //syslog.c  

  2. #include  .h>  

  3. int main(int argc, char **argv)  

  4. {  

  5.     openlog("MyMsgMARK", LOG_CONS | LOG_PID, 0);  

  6.     syslog(LOG_EMERG,  

  7.            "This is a syslog test message generated by program '%s'/n",  

  8.            argv[0]);  

  9.     closelog();  

  10.     return 0;  

  11. }  


編譯運行:

[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具有很強的網絡功能,可以方便地把多臺機器上的日誌保存到一臺中心日誌服務器上。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章