c語言syslog日誌記錄

syslog採用可配置的、統一的系統登記程序,隨時從系統各處接受log請求,然後根據配置文件syslog.conf中的預先設定把log信息寫入到相應文件中、郵寄給特定用戶或直接以消息的方式發往控制檯,爲了防止入侵者修改、刪除messages裏的記錄信息,可以採用打印機記錄或採用方式來挫敗入侵者的企圖。

syslog.conf的格式

/etc/syslog.conf文件中的一項配置記錄由“選項”(selector)和“動作”(action)兩部分組成,兩者間用tab製表符進行分隔(使用空格間隔是無效的)。而“選項”又有一個或多個形如“類型.級別”格式的保留字段組合而成,各保留字段間用分號分隔。如下所示:

類型.級別[;類型.級別] 'TAB' 動作

類型:

    保留字段中的“類型”代表信息產生的源頭,可以是:

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

   保留字段中的“級別”代表信息的重要性,可以是:

    emerg   緊急,處於Panic狀態。通常應廣播到所有用戶; 
    alert   告警,當前狀態必須立即進行糾正。例如,系統數據庫崩潰; 
    crit    關鍵狀態的警告。例如,硬件故障; 
    err     其它錯誤; 
    warning 警告; 
    notice  注意;非錯誤狀態的報告,但應特別處理; 
    info    通報信息; 
    debug   調試程序時的信息; 
    none    通常調試程序時用,指示帶有none級別的類型產生的信息無需送出。如*.debug;mail.none表示調試時除郵件信息外其它信息都送出。
動作:

  “動作”域指示信息發送的目的地。可以是: 

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

   我們來看看/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 - 郵件系統的關鍵警告信息


syslog的使用:

1.在/etc/syslog.conf下加入一行localN.*  pathname
 例  local5.*    /root/Desktop/test.log

2.重新啓動syslog /etc/init.d/syslog   restart

3.使用syslog
實例
#include<stdio.h>
#include<stdlib.h>
#include <syslog.h>
#define SYSNAME "wohawoha"
void Info(void)
{
 openlog("info",LOG_PID,LOG_LOCAL5);/*注意這裏的數字5與第一條裏面提到的local5.*裏的5必須相同,並且這個數字的範圍爲0--7*/
 syslog(LOG_INFO, "hello %s","woring");
}

void Woring(void)
{
 openlog("woring",LOG_PID,LOG_LOCAL5);
 syslog(LOG_WARNING, "hello %s","test");
}

int main()
{
 Info();
 Woring();
 closelog();
 return 0;
}

 

4.進入目錄查看內容
例如:進入/root/Desktop/test.log這個文件查看裏面的內容

Dec 13 12:31:21 localhost info[11750]: hello woring
Dec 13 12:31:21 localhost woring[11750]: hello test

 

以下是本人引用的網上的,感覺這個說的蠻全的

Syslog
Syslog已被許多日誌函數採納,它用在許多保護措施中——任何程序都可以通過syslog 紀錄事件。Syslog可以紀錄系統事件,可以寫到一個文件或設備中,或給用戶發送一個信息。它能紀錄本地事件或通過網絡紀錄另一個主機上的事件。
Syslog設備依據兩個重要的文件:/etc/syslogd(守護進程)和/etc/syslog.conf配置文件,習慣上,多數syslog信息被寫到/var/adm或/var/log目錄下的信息文件中(messages.*)。一個典型的syslog紀錄包括生成程序的名字和一個文本信息。它還包括一個設備和一個優先級範圍(但不在日之中出現)。
每個syslog消息被賦予下面的主要設備之一: 
LOG_AUTH——認證系統:login、su、getty等
LOG_AUTHPRIV——同LOG_AUTH,但只登錄到所選擇的單個用戶可讀的文件中
LOG_CRON——cron守護進程
LOG_DAEMON——其他系統守護進程,如routed
LOG_FTP——文件傳輸協議:ftpd、tftpd
LOG_KERN——內核產生的消息
LOG_LPR——系統打印機緩衝池:lpr、lpd
LOG_MAIL——電子郵件系統
LOG_NEWS——網絡新聞系統
LOG_SYSLOG——由syslogd(8)產生的內部消息
LOG_USER——隨機用戶進程產生的消息
LOG_UUCP——UUCP子系統
LOG_LOCAL0~LOG_LOCAL7——爲本地使用保留
Syslog爲每個事件賦予幾個不同的優先級:
LOG_EMERG——緊急情況 
LOG_ALERT——應該被立即改正的問題,如系統數據庫破壞
LOG_CRIT——重要情況,如硬盤錯誤
LOG_ERR——錯誤
LOG_WARNING——警告信息
LOG_NOTICE——不是錯誤情況,但是可能需要處理
LOG_INFO——情報信息
LOG_DEBUG——包含情報的信息,通常旨在調試一個程序時使用
syslog.conf文件指明syslogd程序紀錄日誌的行爲,該程序在啓動時查詢配置文件。該文件由不同程序或消息分類的單個條目組成,每個佔一行。對每類消息提供一個選擇域和一個動作域。這些域由tab隔開:選擇域指明消息的類型和優先級;動作域指明syslogd接收到一個與選擇標準相匹配的消息時所執行的動作。每個選項是由設備和優先級組成。當指明一個優先級時,syslogd將紀錄一個擁有相同或更高優先級的消息。所以如果指明"crit",那所有標爲crit、alert和emerg的消息將被紀錄。每行的行動域指明當選擇域選擇了一個給定消息後應該把他發送到哪兒。

例如,如果想把所有郵件消息紀錄到一個文件中,如下:
#Log all the mail messages in one place
mail.* /var/log/maillog
其他設備也有自己的日誌。UUCP和news設備能產生許多外部消息。它把這些消息存到自己的日誌(/var/log/spooler)中並把級別限爲"err"或更高。例如:
# Save mail and news errors of level err and higher in aspecial file. 
uucp,news.crit /var/log/spooler
當一個緊急消息到來時,可能想讓所有的用戶都得到。也可能想讓自己的日誌接收並保存。
#Everybody gets emergency messages, plus log them on anther machine
*.emerg *
*.emerg @linuxaid.com.cn 
alert消息應該寫到root和tiger的個人賬號中:
#Root and Tiger get alert and higher messages
*.alert root,tiger
有時syslogd將產生大量的消息。例如內核("kern"設備)可能很冗長。用戶可能想把內核消息紀錄到/dev/console中。下面的例子表明內核日誌紀錄被註釋掉了:
#Log all kernel messages to the console
#Logging much else clutters up the screen
#kern.* /dev/console
用戶可以在一行中指明所有的設備。下面的例子把info或更高級別的消息送到/var/log/messages,除了mail以外。級別"none"禁止一個設備: 
#Log anything(except mail)of level info or higher
#Don't log private authentication messages!
*.info:mail.none;authpriv.none /var/log/messages
在有些情況下,可以把日誌送到打印機,這樣網絡入侵者怎麼修改日誌都沒有用了。通常要廣泛紀錄日誌。Syslog設備是一個攻擊者的顯著目標。一個爲其他主機維護日誌的系統對於防範服務器攻擊特別脆弱,因此要特別注意。
有個小命令logger爲syslog(3)系統日誌文件提供一個shell命令接口,使用戶能創建日誌文件中的條目。用法:logger 例如:logger This is a test!
它將產生一個如下的syslog紀錄:Aug 19 22:22:34 tiger: This is a test! 
注意不要完全相信日誌,因爲攻擊者很容易修改它的。 
三個函數的原型和說明:  
   
  void   openlog(   char   *ident,   int   option,   int     facility)      
  void   syslog(   int   priority,   char   *format,   ...)      
  void   closelog(   void   )  
   
  priority是facility及level的組合,其後參數的用法類似printf。  
       
  例: 

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

int main(int argc,char* argv[])
{
       openlog("HEMM",LOG_CONS | LOG_PID, LOG_USER);

       int count=0;
       while(count<5){
             syslog(LOG_INFO,"%d, log info test...",count);
             count++;
      }

      closelog();

      return 0;
}

  檢驗:    
  #tail   -f   /var/log/messages      

Jul 13 11:54:08 localhost HEMM[7631]: 0, log info test...
Jul 13 11:54:08 localhost HEMM[7631]: 1, log info test...
Jul 13 11:54:08 localhost HEMM[7631]: 2, log info test...
Jul 13 11:54:08 localhost HEMM[7631]: 3, log info test...
Jul 13 11:54:08 localhost HEMM[7631]: 4, log info test...

  --------------------------------------------------------------------------------    
  option      
                用於openlog()的option參數可以是以下幾個的組合:      
                LOG_CONS   :   如果送到system   logger時發生問題,直接寫入系統console。      
                LOG_NDELAY   :   立即開啓連接(通常,連接是在第一次寫入訊息時纔打開的)。      
                LOG_PERROR   :     將訊息也同時送到stderr      
                LOG_PID   :     將PID含入所有訊息中      
  facility      
                該參數用來指定何種程式在記錄訊息,這可讓設定檔來設定何種訊息如何處理。      
                LOG_AUTH   :   安全/授權訊息(別用這個,請改用LOG_AUTHPRIV)      
                LOG_AUTHPRIV   :   安全/授權訊息      
                LOG_CRON   :   時間守護神專用(cron及at)      
                LOG_DAEMON   :   其它系統守護神      
                LOG_KERN   :   核心訊息      
                LOG_LOCAL0到LOG_LOCAL7   :   保留      
                LOG_LPR   : line   printer次系統      
                LOG_MAIL   :   mail次系統      
                LOG_NEWS   :   USENET   news次系統      
                LOG_SYSLOG   :   syslogd內部所產生的訊息      
                LOG_USER(default)   :   一般使用者等級訊息      
                LOG_UUCP   :   UUCP次系統      
  level      
  決定訊息的重要性.     以下的等級重要性逐次遞減:    
                LOG_EMERG   :   系統無法使用      
                LOG_ALERT   :   必須要立即採取反應行動      
                LOG_CRIT   :   重要狀況發生      
                LOG_ERR   :   錯誤狀況發生      
                LOG_WARNING   :   警告狀況發生      
                LOG_NOTICE   :   一般狀況,但也是重要狀況      
                LOG_INFO   :   資訊訊息      
  LOG_DEBUG   :   除錯訊息  
如果沒有改配置文件的話,默認的會寫到   /var/log/messages   中。  
   
  可以看看你的syslog   配置文件   /etc/syslog.conf,比如我的是:  
  #   Log   all   kernel   messages   to   the   console.  
  #   Logging   much   else   clutters   up   the   screen.  
  #kern.* /dev/console  
   
  #   Log   anything   (except   mail)   of   level   info   or   higher.  
  #   Don't   log   private   authentication   messages!  
  *.info;mail.none;authpriv.none;cron.none /var/log/messages  
   
  #   The   authpriv   file   has   restricted   access.  
  authpriv.* /var/log/secure  
   
  #   Log   all   the   mail   messages   in   one   place.  
  mail.* /var/log/maillog  
   
  #   Log   cron   stuff  
  cron.* /var/log/cron  
   
  #   Everybody   gets   emergency   messages  
  *.emerg *  
   
  #   Save   news   errors   of   level   crit   and   higher   in   a   special   file.  
  uucp,news.crit /var/log/spooler  
   
  #   Save   boot   messages   also   to   boot.log  
  local7.* /var/log/boot.log  
   
  該文件的格式爲   facility.priority   action,這些字段的定義如下:  
   
  facility    
  指定產生消息的子系統。facility   有效的關鍵字有   auth、authpriv、cron、daemon、kern、lpr、mail、news、syslog、user、uucp   以及   local0   到   local7。  
   
  priority    
  指定消息的最低嚴重性,即此優先級和高於此優先級的消息將由這個規則匹配。priority   的有效關鍵字有   debug、info、notice、warning、err、crit、alert   和   emerg。  
   
  action    
  action   字段可以是文件名、tty(如   /dev/console)、以   @   爲前綴的遠程機器、以逗號分隔的用戶列表,或是   *   以表明向所有登錄用戶發送消息。最常見的操作是一個簡單的文件名。  
   
  注意看着一行:*.info;mail.none;authpriv.none;cron.none     /var/log/messages  
  因此所有比   LOG_INFO   級別高的訊息(當然包括LOG_ERR   了)都會寫到   /var/log/messages中。   
syslog.conf由syslogd讀取。syslogd接受用戶空間發送來的日誌信息。用戶空間程序通過調用和syslog相關的api發送日誌,接口上面的帖子已經有了。
消息通過本地UNIX套接字發送給syslogd,由syslogd根據配置文件中的配置進行處理。
內核消息不是直接發送給syslogd的,而是由klogd讀取/proc/kmesg文件,將其中讀取的內核日誌信息再轉發給syslogd。
本身syslog的api沒有什麼複雜的,我建議你可以看看syslogd和klogd的源代碼,也不大,總共不到5000行。
最後的附錄裏介紹的很清楚。。先看這個。。
unix環境高級編程裏也有一些,,還設計到內核的log,後參考這個。。。
函數常用的就着麼幾個openlig syslog closelog
man   syslog   

轉載自:http://blog.csdn.net/yangxuan12580/article/details/51497069

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