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

weixin_33896726發表於2016-12-29

一、簡介

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檔案新增如下訊息規則作為第一條規則:

  1. 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檔案都會增加一條新的記錄!

相關文章