Linux日誌管理——syslog

一、簡介

    Linux下日誌主要在/var/log下,好比:message、warn、localmessages等,在suse11下,由進程/sbin/syslog-ng負責日誌打印
    配置文件:
    /etc/syslog-ng/syslog-ng.conf
    /etc/sysconfig/syslog html

二、消息類型和優先級

消息類型
消息來源
kern
內核
User
用戶程序
Damon
系統守護進程
Mail
電子郵件系統
Auth
與安全權限相關的命令
Lpr
打印機
News
新聞組信息
Uucp
Uucp程序
Cron
記錄當前登陸的每一個用戶信息
wtmp
一個用戶每次登陸進入和退出時間的永久記錄
Authpriv
受權信息


優先級
描述
emerg
最高的緊急程序狀態
alert
緊急狀態
Cirt
重要信息
warning
警告
err
臨界狀態
notice
出現不尋常的事情
info
通常性信息
Debug
調試級信息
None
不記錄任何日誌信息


三、函數接口

在Linux中,提供了四個有關syslog日誌系統的系統調用,供用戶使用: 數據庫

  • openlog:打開日誌設備,以供讀取和寫入,與文件系統調用的open相似;
  • syslog:寫入日誌,與文件系統調用的write相似;
  • closelog:關閉日誌設備,與文件系統調用的close相似;
  • vsyslog:它和syslog功能同樣,負責寫入日誌,只是參數格式不一樣。
(1)openlog函數

該函數的聲明以下:
void openlog(const char *ident, int option, int facility);

此函數用來打開一個到系統日誌記錄程序的鏈接,打開以後就能夠用syslog或vsyslog函數向系統日誌裏添加信息了。而closelog函數就是用來關閉此鏈接的。
openlog 的第一個參數ident是一個標記,ident所表示的字符串將固定地加在每行日誌的前面以標識這個日誌,一般就寫成當前程序的名稱以做標記。第二個參數 option通常是下列選項值取「與」運算(使用「|」表示,如「LOG_CONS | LOG_PID」)的結果:
  • LOG_CONS:若是送到system logger時發生問題,直接寫入系統終端;
  • LOG_NDELAY:當即開啓鏈接,一般鏈接是在第一次寫入消息時纔打開的;
  • LOG_PERROR:將消息也同時送到stderr設備;
  • LOG_PID:將進程PID含入全部消息中。
第三個參數facility指明記錄日誌的程序的類型,它主要具備以下幾類日誌類型:
  • LOG_AUTH :安全/受權消息
  • LOG_AUTHPRIV:安全/受權消息
  • LOG_CRON:時間守護進程(cron和at)專用
  • LOG_DAEMON:其它系統守護進程
  • LOG_KERN:核心消息
  • LOG_LOCAL0到LOG_LOCAL7:系統保留
  • LOG_LPR:printer子系統
  • LOG_MAIL:mail子系統
  • LOG_NEWS:USENET新聞子系統
  • LOG_SYSLOG:syslogd進程內部所產生的消息
  • LOG_USER(缺省):通常使用者缺省使用消息
  • LOG_UUCP:UUCP子系統
  • LOG_FTP:FTP子系統使用

(2)syslog函數

syslog函數的聲明以下:
void syslog(int priority, const char * message, ...);

第一個參數是消息的緊急級別priority,第二個參數是消息及其格式,以後是格式對應的參數,如同C語言裏面printf輸出函數同樣使用,具體的格式這裏就再也不詳述。
第一個參數priority,它是由severity level和facility組成的。Facility已經在上面介紹了,下面介紹一下severity level,也就是消息的重要級別,它主要包括: 安全

  • LOG_EMERG:緊急情況
  • LOG_ALERT:高優先級問題,好比說數據庫崩潰等,必需要當即採起反應行動
  • LOG_CRIT:重要情況發生,好比硬件故障
  • LOG_ERR:錯誤發生
  • LOG_WARNING:警告發生
  • LOG_NOTICE:通常情況,須要引發注意
  • LOG_INFO:信息情況
  • LOG_DEBUG:調試消息

在實際使用中,若是咱們的程序要使用系統日誌功能,只須要在程序啓動時使用openlog函數來鏈接syslogd程序,後面隨時用syslog函數寫日誌就好了。 ide



(3)closelog函數

其聲明以下:
void closelog( void );

值得注意的是,雖然該函數的使用和調用狀況很是簡單,可是是必不可少的,由於在Linux系統中,打開的日誌也是資源,若是隻使用openlog函數打開 日 志,而忘記使用closelog關閉日誌的話,當打開的日誌數量累積到必定程度,便會形成內存不足,從而引發系統問題。 函數

四、程序調用舉例

1)用syslog打印 spa

#include <syslog.h>
#include <stdio.h>
#include <stdarg.h>

int main(void)
{
    int log_test;

    /*打開日誌*/
    openlog("main", LOG_PID|LOG_CONS, LOG_USER);

    /*寫日誌*/
    syslog(LOG_INFO, "PID information, pid=%d", getpid());

    /*關閉日誌*/
    closelog();
    return 1;
}

2)用vsyslog打印 調試

#include <syslog.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

void p_syslog(char *format, ...)
{
    va_list ap;
    va_start(ap, format);
    vsyslog(LOG_INFO, format, ap);
    va_end(ap);
}
int main(void)
{
    openlog("main", LOG_PID, 0);

    int a = 10;
    p_syslog("test is %d\n",a);

    closelog();
    return 1;
}
程序運行的結果寫入日誌:/var/log/message

【End】 日誌


本文部分概念描述性內容摘自:
http://weisjohn.blog.163.com/blog/static/310152562012326113450226
http://hi.baidu.com/ugo5/blog/item/cb90ca0b224ce82de8248831.html code

相關文章
相關標籤/搜索