linux日誌系統介紹 —— syslog(),openlog(),closelog()

函數使用介紹


這裏面的三個函數openlog, syslog,closelog是一套系統日誌寫入接口。另外那個vsyslog和syslog功能一樣,只是參數格式不同。

        通常,syslog守護進程讀取三種格式的記錄消息。此守護進程在啓動時讀一個配置文件。一般來說,其文件名爲/etc/syslog.conf,該文件決定了不同種類的消息應送向何處。例如,緊急消息可被送向系統管理員(若已登錄),並在控制檯上顯示,而警告消息則可記錄到一個文件中。該機制提供了syslog函數,其調用格式如下
#include <syslog.h>
void openlog (char*ident,int option ,int facility);
void syslog(int priority,char*format,……)
void closelog();

       

        調用openlog是可選擇的。如果不調用openlog,則在第一次調用syslog時,自動調用openlog。調用closelog也是可選擇的,它只是關閉被用於與syslog守護進程通信的描述符。調用openlog使我們可以指定一個ident,以後, 此ident 將被加至每則記錄消息中。ident 一般是程序的名稱(例如 ,cron ,ine等)


程序的用法示例代碼如下:

#include <syslog.h>
int main(int argc, char **argv)
{
   openlog("MyMsgMARK", LOG_CONS | LOG_PID, 0);
   syslog(LOG_DEBUG,
          "This is a syslog test message generated by program '%s'\n",
          argv[0]);
   closelog();
   return0;
}

編譯生成可執行程序後,運行一次程序將向/var/log/message文件添加一行信息如下:
Feb 12 08:48:38 localhost MyMsgMARK[7085]: This is a syslog testmessage generated by program './a.out'

openlog及closelog函數說明


此函數原型如下:
void openlog(const char *ident, int option, int facility);

此函數用來打開一個到系統日誌記錄程序的連接,打開之後就可以用syslog或vsyslog函數向系統日誌裏添加信息了。而closelog函數就是用來關閉此連接的。

openlog的參數:

第一個參數ident將是一個標記,ident所表示的字符串將固定地加在每行日誌的前面以標識這個日誌,通常就寫成當前程序的名稱以作標記。

第二個參數option是下列值取與運算的結果:LOG_CONS,LOG_NDELAY, LOG_NOWAIT, LOG_ODELAY, LOG_PERROR,LOG_PID,各值意義請參考man openlog手冊:
    LOG_CONS
       Writedirectly to system console if there is an error while sending tosystem logger.

    LOG_NDELAY
       Openthe connection immediately (normally, the connection is opened whenthe first message is logged).

    LOG_NOWAIT
       Don’t wait for childprocesses that may have been created while logging themessage.  (The GNU C library does not createa child process, so this option has no effect onLinux.)

    LOG_ODELAY
       The converseof LOG_NDELAY; opening of the connection is delayed until syslog()is called.  (This is the default,  and need not be specified.)

    LOG_PERROR
       (Notin SUSv3.) Print to stderr as well.

    LOG_PID
        IncludePID with each message.

第三個參數facility指明記錄日誌的程序的類型。

        The facility argument is used to specify what type ofprogram  is logging  the  message.
        This  lets the configuration file specify thatmessages from different facilities will be
        handled differently.
        LOG_AUTH      security/authorization messages (DEPRECATED Use LOG_AUTHPRIVinstead)
        
        LOG_AUTHPRIV  security/authorization messages (private)
        
        LOG_CRON      clock daemon (cron and at)
        
        LOG_DAEMON    system daemons without separate facility value
        
        LOG_FTP       ftp daemon
        
        LOG_KERN      kernel messages (these can't be generage from user processes)
        
        LOG_LOCAL0 through LOG_LOCAL7
                       reserved for local use
        
        LOG_LPR       line printer subsystem
        
        LOG_MAIL      mail subsystem
        
        LOG_NEWS      USENET news subsystem
        
        LOG_SYSLOG    messages generated internally by syslogd(8)
        
        LOG_USER (default)
                       generic user-level messages
        
        LOG_UUCP      UUCP subsystem

 

syslog函數及參數

syslog函數用於把日誌消息發給系統程序syslogd去記錄,此函數原型是:
void syslog(int priority, const char *format, ...);
第一個參數是消息的緊急級別

第二個參數是消息的格式,之後是格式對應的參數。就是printf函數一樣使用。

        如果我們的程序要使用系統日誌功能,只需要在程序啓動時使用openlog函數來連接syslogd程序,後面隨時用syslog函數寫日誌就行了。

level
        This determines the importance of the message. The levels are, in  order of  decreasing
        importance:
        
        LOG_EMERG     system is unusable
        
        LOG_ALERT     action must be taken immediately
        
        LOG_CRIT      critical conditions
        
        LOG_ERR       error conditions
        
        LOG_WARNING   warning conditions
        
        LOG_NOTICE    normal, but significant, condition
        
        LOG_INFO      informational message
        
        LOG_DEBUG     debug-level message
        
        The function setlogmask(3) can be used to restrict logging tospecified levels only.

NOTES
        The  argument ident  in  the call  of openlog() is probably storedas-is.  Thus, if the
        string it points to is changed, syslog() may start prepending thechanged string, and  if
        the  string it points to ceases to exist, theresults are undefined.  Most portable is to
        use a string constant.
        
        Never pass a string with user-supplied data as a format, use thefollowing instead:
        
            syslog(priority, "%s", string);

SEE ALSO
      logger(1), setlogmask(3), syslog.conf(5), syslogd(8)


***************************************************************************************************************************************************

syslog.conf文件解讀

1: syslog.conf的介紹


    對於不同類型的Unix,標準UnixLog系統的設置,實際上除了一些關鍵詞的不同,系統的syslog.conf格式是相同的。syslog採用可配置的、統一的系統登記程序,隨時從系統各處接受log請求,然後根據/etc/syslog.conf中的預先設定把log信息寫入相應文件中、郵寄給特定用戶或者直接以消息的方式發往控制檯。值得注意的是,爲了防止入侵者修改、刪除messages裏的記錄信息,可以採用用打印機記錄或採用方式來挫敗入侵者的企圖。


2: syslog.conf的格式


    可以參考man [5] syslog.conf。這裏是對syslog.conf的簡單介紹。
    /etc/syslog.conf文件中的一項配置記錄由“選項”(selector)和“動作”(action)兩個部分組成,兩者間用tab製表符進行分隔(使用空格間隔是無效的)。而“選項”又由一個或多個形如“類型.級別”格式的保留字段組合而成,各保留字段間用分號分隔。如下行所示:
        類型.級別 [;類型.級別] `TAB` 動作
        

    2.1 類型

        保留字段中的“類型”代表信息產生的源頭,可以是:
        auth    認證系統,即詢問用戶名和口令
        cron    系統定時系統執行定時任務時發出的信息
        daemon  某些系統的守護程序的syslog,如由in.ftpd產生的log
        kern    內核的syslog信息
        lpr     打印機的syslog信息
        mail    郵件系統的syslog信息
        mark    定時發送消息的時標程序
        news    新聞系統的syslog信息
        user    本地用戶應用程序的syslog信息
        uucp    uucp子系統的syslog信息
        local0..7 種本地類型的syslog信息,這些信息可以又用戶來定義

        *       代表以上各種設備

    2.2 級別

        保留字段中的“級別”代表信息的重要性,可以是:
        emerg   緊急,處於Panic狀態。通常應廣播到所有用戶;
        alert   告警,當前狀態必須立即進行糾正。例如,系統數據庫崩潰;
        crit    關鍵狀態的警告。例如,硬件故障;
        err     其它錯誤;
        warning 警告;
        notice  注意;非錯誤狀態的報告,但應特別處理;
        info    通報信息;
        debug   調試程序時的信息;

        none    通常調試程序時用,指示帶有none級別的類型產生的信息無需送出。如*.debug;mail.none表示調試時除郵件信息外其它信息都送出。

    2.3 動作

        “動作”域指示信息發送的目的地。可以是:
        /filename   日誌文件。由絕對路徑指出的文件名,此文件必須事先建立;
        @host       遠程主機; @符號後面可以是ip,也可以是域名,默認在/etc/hosts文件下loghost這個別名已經指定給了本機。
        user1,user2 指定用戶。如果指定用戶已登錄,那麼他們將收到信息;
        *           所有用戶。所有已登錄的用戶都將收到信息。

3: 具體實例

    我們來看看/etc/syslog.conf文件中的實例:
    ……
    *.err;kern.debug;daemon.notice;mail.crit    [TAB]   /var/adm/messages
    ……

    這行中的“action”就是我們常關心的那個/var/adm/messages文件,輸出到它的信息源頭“selector”是:
    *.err - 所有的一般錯誤信息;
    kern.debug - 核心產生的調試信息;
    daemon.notice - 守護進程的注意信息;

    mail.crit - 郵件系統的關鍵警告信息


                                                                                                    — — 以上所有內容均來自互聯網


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