syslog簡介——系統日誌寫入API

一、簡介

syslog是Linux系統默認的日誌守護進程。默認的主配置文件和輔助配置文件分別是/etc/syslog.conf和/etc/sysconfig/syslog文件。通常,syslog 接受來自系統的各種功能的信息,每個信息都包括重要級。/etc/syslog.conf 文件通知 syslogd 如何根據設備和信息重要級別來報告信息。

二、配置文件

/etc/syslog.conf 文件按照以下格式進行配置

facility.level    action
說明 :facility.level爲選擇條件,本身分爲兩個字段,之間用一個小數點(.)分隔。action和facility.level之間使用TAB隔開。

facility 消息類型,指定 syslog 功能,主要包括:

複製代碼
kern     內核信息,首先通過 klogd 傳遞;
user     用戶進程;
mail     郵件;
daemon   後臺進程;
authpriv 授權信息;
syslog   系統日誌;
lpr      打印信息;
news     新聞組信息;
uucp     由uucp生成的信息
cron     計劃和任務信息。
mark     syslog 內部功能用於生成時間戳
local0----local7   與自定義程序使用,例如使用 local5 做爲 ssh 功能
*        通配符代表除了 mark 以外的所有功能
複製代碼

level 消息級別,指定syslog優先級,主要包括:

複製代碼
emerg 或 panic   該系統不可用(最緊急消息)
alert            需要立即被修改的條件(緊急消息)
crit             阻止某些工具或子系統功能實現的錯誤條件(重要消息)
err              阻止工具或某些子系統部分功能實現的錯誤條件(出錯消息)
warning          預警信息(警告消息)
notice           具有重要性的普通條件(普通但重要的消息)
info             提供信息的消息(通知性消息)
debug            不包含函數條件或問題的其他信息(調試級-信息量最多)
none             沒有重要級,通常用於排錯(不記錄任何日誌消息)
*                所有級別,除了none
複製代碼

action 動作域,主要包括:

操作動作

日誌信息可以分別記錄到多個文件裏,還可以發送到命名管道、其他程序甚至另一臺機器。包括三類:

file                    指定文件的絕對路徑

terminal 或 prin        完全的串行或並行設備標誌符

@host(@IP地址)    遠程的日誌服務器

複製代碼
/var/log/lastlog : 記錄每個使用者最近簽入系統的時間
/var/run/utmp : 記錄每個使用者簽入系統的時間, who, users, finger 等指令會查這個檔案.

/var/log/wtmp : 記錄每個使用者簽入及簽出的時間, last 這個指令會查這個檔案. 這個檔案也記錄 shutdown 及 reboot 的動作.

/var/log/secure : 登錄系統的信息

/var/log/maillog : 記錄 sendmail 及 pop 等相關訊息.

/var/log/cron : 記錄 crontab 的相關訊息 ,定時器的信息

/var/log/dmesg : /bin/dmesg 會將這個檔案顯示出來, 它是開機時的畫面訊息.

/var/log/xferlog : 記錄那些位址來 ftp 拿取那些檔案.

/var/log/messages : 系統大部份的訊息皆記錄在此, 包括 login, check password , failed login, ftp, su 等.
複製代碼

syslog APIs

Linux C中提供一套系統日記寫入接口,包括三個函數:openlog,syslog和closelog。調用openlog是可選擇的。如果不調用openlog,則在第一次調用syslog時,自動調用openlog。調用closelog也是可選擇的,它只是關閉被用於與syslog守護進程通信的描述符。

其中openlog和closelog都是可選的。不過,通過調用openlog,我們可以指定ident參數。這樣,ident將被加到每條日記記錄中。ident一般設成程序的名字,如在下面例子中的"testsyslog"

複製代碼
#include <syslog.h>   
int main(int argc, char *argv[])   
{   
    openlog("testsyslog", LOG_CONS | LOG_PID, 0);   
    syslog(LOG_USER | LOG_INFO, "syslog test message generated in program %s \n", argv[0]);   
    closelog();   
    return 0;   
}  
複製代碼

編譯生成可執行文件後,每運行一次,程序將往/var/log/messages添加一條如下的記錄

  1. Apr 23 17:15:15 lirong-920181 testsyslog[27214]: syslog test message generated in program ./a.out  

格式基本是:timestamp hostname ident[pid]:log message。其中ident就是我們調用openlog是指定的"testsyslog",而之所以會打印出[27214]是openlog的option參數中指定了LOG_PID。

 

一般來說,我們希望能夠爲自己的應用程序指定特定的日記文件。這時候,我們就需要修改syslog.conf文件。假設我們現在要把調試(debug)日記記錄寫到文件/var/log/debug文件中。第一步要做的是,在syslog.conf文件添加如下消息規則作爲第一條規則:

user.debug                  /var/log/debug  

要是添加的新規則生效,第二步我們需要重啓syslogd和klogd:service syslog restart(ubuntu下爲/etc/init.d/rsyslog restart)

爲了測試新規則是否生效,我們可以將testsyslog修改如下:

複製代碼
#include <syslog.h>   
  
int main(int argc, char *argv[])   
{   
    openlog("testsyslog", LOG_CONS | LOG_PID, 0);   
    syslog(LOG_USER | LOG_DEBUG, "syslog test message generated in program %s \n", argv[0]);   
    closelog();   
    return 0;   
}  
複製代碼

編譯生成執行文件後,每運行一次,/var/log/debug文件都會增加一條新的記錄


轉載自:http://www.cnblogs.com/bonelee/p/6234647.html

發佈了37 篇原創文章 · 獲贊 24 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章