syslog(),closelog()與openlog()--日誌操作函數 (1)

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   io   os   使用   ar   

    文章出處:http://blog.csdn.net/xx77009833/archive/2010/07/30/5776383.aspx

 為了滿足某些目的,進行日誌記錄是很有必要的。

    在典型的 LINUX 安裝中,/var/log/messages 包含所有的系統訊息,/var/log/mail 包含來自郵件系統的其它日誌訊息, /var/log/debug 可能包含調試訊息。根據你的LINUX的版本,你可以在 /etc/syslog.conf 或者 /etc/syslog-ng/syslog-ng.conf 檔案裡檢查你的系統(訊息)配置情況。

    儘管系統訊息的格式和儲存位置可能不同,但產生訊息的方法卻是標準的。UNIX 技術規範(specification)為所有程式組建記錄檔訊息提供了一個介面,這通過
syslog() 函數實現:

[cpp] view plaincopy
  1. #include <syslog.h>  
  2. void syslog(int priority, const char *message, arguments...);  

    syslog() 函數向日誌裝置(日誌工具 facility)發送日誌訊息。每一個訊息都有一個 priority(優先順序) 參數,這個參數由一個“危險係數”(severity level)和一個程式標識碼(facility value)相或(OR)得來。

    “危險係數”用來調控(control)如何對這條日誌訊息做出響應的(以哪一種危險等級來響應);程式標識碼記錄著發出這條訊息是哪一個程式。(The severity level controls how the log message is acted upon)

    程式標識碼(定義自 syslog.h)包含 LOG_USER----用來指示這訊息是來自使用者的應用程式(預設值)的。
LOG_LOCAL0, LOG_LOCAL1...LOG_LOCAL7 --這些都可以由本地管理員來進行賦值。

以下是危險等級的降序排列:

Priority Level                             Description
LOG_EMERG                                緊急狀況
LOG_ALERT                                高優先順序故障,如資料庫損壞
LOG_CRIT                                 關鍵性(critical)錯誤,如硬體操作失敗
LOG_ERR                                  一般錯誤
LOG_WARNING                             一般警告
LOG_NOTICE                               需要注意的特殊條件
LOG_INFO                                 通知性訊息(Information messages)
LOG_DEBUG                               調試訊息

    根據系統的配置,LOG_EMERG 訊息可能會向所有使用者進行廣播,LOG_ALERT 訊息可能會給管理員發出一個郵件,LOG_DEBUG 訊息可能會被忽略,而其它的訊息都寫到一個訊息檔案中去。當你想建立一個日誌訊息時,你可以簡單的寫一個使用日誌工具的程式,這通過調用 syslog() 函數即可。

    由 syslog() 函數建立的日誌訊息由訊息標題(message header)和訊息內容(message body)組成。訊息標題由裝置指示符(facility indicator)、日期和時間來建立。訊息內容由syslog() 函數中的 message 參數產生,這個和 printf() 的格式字串的使用類似。syslog() 後面其他的參數按照 message 字串裡的 printf() 風格轉換說明符給出(Further arguments to syslog() are used according to printf() style conversion specifiers in the message string)。另外,指示符 %m 可用來插入錯誤資訊字串,這個字串和當前的錯誤變數 errno 所對應。這對於日誌錯誤資訊記錄很有用。

測試代碼:

[cpp] view plaincopy
  1. 01 #include <syslog.h>  
  2. 02 #include <stdio.h>  
  3. 03 #include <stdlib.h>  
  4. 04   
  5. 05 int main()  
  6. 06 {  
  7. 07         FILE *f;  
  8. 08   
  9. 09         f = fopen("not_here", "r");  
  10. 10   
  11. 11         if(!f)  
  12. 12                 syslog(LOG_ERR|LOG_USER, "oops - %m/n");  
  13. 13         exit(0);  
  14. 14 }  

執行輸出:
沒有顯示輸出,但是會把錯誤資訊寫到記錄檔中,通過查看 /var/log/messages 可以看得到:
Feb 24 00:49:45 localhost syslog.exe: oops - No such file or directory

%m 轉換控制符被一個錯誤描述資訊所替換,在上面的程式中,錯誤的原因是沒有找到需要的檔案。這比單純的報告錯誤編號要來得有用的多。

其他的用來改變日誌功能的行為的函數也定義在 syslog.h 標頭檔中:

[cpp] view plaincopy
  1. #include <syslog.h>  
  2. void closelog(void);  
  3. void openlog(const char *ident, int logopt, int facility);  
  4. int setlogmask(int maskpri);  

你可以通過調用 openlog() 函數改變你的日誌訊息的呈現方式。這允許你設定一個字串--ident,這將被加在你的日誌訊息的最前面。你可以使用這些來指示哪一個程式正在建立這條訊息。facility 參數記錄了一個預設的程式標識碼---這在後來使用 syslog() 裡會被用到。
預設的 facility 值為 LOG_USER. logopt 參數配置將來要調用 syslog() 函數的行為。它是0個或多個一下參數的OR運算:

logopt Parameter                             Description
LOG_PID                               加上進程標識符(系統分配給每個進程的一個獨一無二的數位識別碼)
LOG_CONS                             如果訊息無法記錄到記錄檔裡則發送訊息到控制台
LOG_NDELAY                           在第一次調用 syslog 函數時開啟日誌功能
LOG_NDELAY                           立即開啟日誌功能,而不等到第一次記日誌時

openlog() 函數將分配和開啟一個用來寫到日誌功能的檔案描述符,你也可以通過調用 closelog() 函數來關閉它。注意,你無須在調用 syslog() 之前調用 openlog() ,這是因為如果有需要的話 syslog 它自己也會開啟日誌功能。

通過設定一個日誌掩碼(使用 setlogmask()函數 )你可以控制日誌訊息的優先順序。此後, 所有沒有在日誌掩碼裡置位的優先順序的 syslog()調用都要被丟棄。舉例來說,你可以使用這來關閉 LOG_DEBUG 訊息而無須影響程式內容。

使用 LOG_MASK(priority) 你可以為日誌訊息建立一個掩碼,通過這樣建立的掩碼僅由一個優先順序組成;或者是 LOG_UPTO(priority)這建立的掩碼由指定優先順序之前所有優先順序組成(也包含指定優先順序自身)。

[cpp] view plaincopy
  1. 01 #include <syslog.h>  
  2. 02 #include <stdio.h>  
  3. 03 #include <unistd.h>  
  4. 04 #include <stdlib.h>  
  5. 05   
  6. 06 int main()  
  7. 07 {  
  8. 08         int logmask;  
  9. 09   
  10. 10         openlog("logmask", LOG_PID|LOG_CONS, LOG_USER);  
  11. 11         syslog(LOG_INFO, "informative message, pid = %d", getpid());  
  12. 12         syslog(LOG_DEBUG, "debug message, should appear");  
  13. 13         logmask = setlogmask(LOG_UPTO(LOG_NOTICE));  
  14. 14         syslog(LOG_DEBUG,"debug message, should not appear");  
  15. 15   
  16. 16         exit(0);  
  17. 17 }  

程式說明:
在運行 logmask 程式後不產生任何輸出,但在典型的 linux 系統上,在 /var/log/messages 的末尾處,可以看到

[cpp] view plaincopy
  1. Feb 26 17:48:59 localhost logmask[14184]: informative message, pid = 14184  

可能在 /var/log/debug (centos5 沒這個檔案) 或者有時在 /var/log/messages 中會包含如下行:

[cpp] view plaincopy
  1. Feb 26 22:23:42 localhost logmask[11730]: debug message, should appear  

10).調用了 openlog() 函數。openlog() 函數的作用是開啟一個日誌串連。其中參數 ident 是一個字串指標,它所指向的字串會放在每個訊息的前面,通常的應用都是設定為程式名,用來指示是哪個程式建立裡這個訊息。所以,這裡就為 logmask 這個程式名。

第二個參數 LOG_PID|LOG_CONS 設定就是要告訴後面在調用 syslog() 對日誌進行記錄時,要包含進程PID號資訊,如果無法對日誌進行記錄操作,則把訊息發往控制台。

第三個參數是 facility . facility 參數用來指定是什麼程式類型在記錄日誌。如預設類型是 LOG_USER(通用的使用者級訊息),LOG_FTP(FTP 守護進程記錄的訊息<FTP守護進程程式類型>),LOG_KERN(核心訊息<核心程式類型>)等等,詳見 man 手冊。上面舉例中用的是 LOG_USER 這個預設類型。

注意:在上面程式中,/var/log/debug 檔案原本是沒有的,那是因為沒有啟用這個日誌功能,要啟用 debug 記錄功能,在 /etc/syslog.conf 中添加以下內容:

[cpp] view plaincopy
  1. 引用   
  2. #debug messages  
  3. *.debug /var/log/debug  

編輯並儲存檔案後,重啟電腦即可。

在程式中,debug message, should not appear 這條訊息不會出現,因為調用了 setlogmask() 函數,這裡忽略了所有低於 LOG_NOTICE 優先順序的所有訊息,而 LOG_DEBUG 優先順序最低,自然不會被記錄到 /var/log/debug 檔案中。(注意:這種做法在早期的核心中行不通).

這是因為 LOG_UPTO(priority) 是一個宏,這個宏表示:低於 priority 優先順序的訊息都不會在掩碼中被置位,也就是在進一步調用 syslog() 函數時,裡面的訊息是無法記錄到記錄檔的。

上面的程式使用了 getpid() 函數,它和一個非常接近的函數 getppid() 的函數定義在一起:

[cpp] view plaincopy
    1. #include <sys/types.h>  
    2. #include <unistd.h>  
    3. pid_t getpid(void);  
    4. pid_t getppid(void);  
    5. http://www.groad.net/bbs/read.php?tid-612-fpage-5.html  
    6. LOG_ALERT=1  
    7. LOG_CRIT=3  
    8. LOG_ERR=3 

syslog(),closelog()與openlog()--日誌操作函數 (1)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.