Linux syslog 學習


最經有在看lighttpd facgi相關的東西。在lighttpd官網上看到如下sample code。

#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <alloca.h>
#include <fcgiapp.h>
#define LISTENSOCK_FILENO 0
#define LISTENSOCK_FLAGS 0
int main(int argc, char** argv) {
  openlog("testfastcgi", LOG_CONS|LOG_NDELAY, LOG_USER);
  int err = FCGX_Init(); /* call before Accept in multithreaded apps */
  if (err) { syslog (LOG_INFO, "FCGX_Init failed: %d", err); return 1; }
  FCGX_Request cgi;
  err = FCGX_InitRequest(&cgi, LISTENSOCK_FILENO, LISTENSOCK_FLAGS);
  if (err) { syslog(LOG_INFO, "FCGX_InitRequest failed: %d", err); return 2; }

  while (1) {
    err = FCGX_Accept_r(&cgi);
    if (err) { syslog(LOG_INFO, "FCGX_Accept_r stopped: %d", err); break; }
    char** envp;
    int size = 200;
    for (envp = cgi.envp; *envp; ++envp) size += strlen(*envp) + 11;
    char*  result = (char*) alloca(size);
    strcpy(result, "Status: 200 OK\r\nContent-Type: text/html\r\n\r\n");
    strcat(result, "<html><head><title>testcgi</title></head><body><ul>\r\n");

    for (envp = cgi.envp; *envp; ++envp) {
      strcat(result, "<li>"); 
      strcat(result, *envp); 
      strcat(result, "</li>\r\n");
    }

    strcat(result, "</ul></body></html>\r\n");
    FCGX_PutStr(result, strlen(result), cgi.out);
  }

  return 0;
}

此fastcgi進程是將log輸出到syslog.對syslog不是很了解,於是乎查了下。syslog主要是linux的log系統。主要有下面3個api:openlog,syslog和closelog,以供用戶進程將一些log寫入對應的系統日志。

 void openlog(const char *ident, int option, int facility);  

函數說明:打開日志設備,以供讀取和寫入,與文件系統調用的open類似;調用openlog是可選擇的。如果不調用openlog,則在第一次調用syslog時,自動調用openlog。  

參數說明:  

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

option:  

指定openlog函數和接下來調用的syslog函數的控制標志。可以取以下值:  

LOG_CONS        如果將信息發送給 syslogd 守護進程時發生錯誤,直接將相關信息輸出到終端  

LOG_NDELAY      立即打開與系統日志的連接(通常情況下,只有在產生第一條日志信息的情況下才會打開與日志系統的連接)  

LOG_ODELAY      類似於 LOG_NDELAY 參數,與系統日志的連接只有在 syslog 函數調用時才會創建  

LOG_PERROR      在將信息寫入日志的同時,將信息發送到標准錯誤輸出  

LOG_PID         每條日志信息中都包含進程號  

facility :指定記錄消息程序的類型,與 syslogd 守護進程的配置文件 syslog.conf 中的 facility 對應。可取如下值:  

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     本地使用保留 

 void syslog(int priority, const char *format, ...);  

函數說明:寫入日志,與文件系統調用 write 類似。  

priority:表示消息的級別,與 syslogd 守護進程的配置文件 syslog.conf 中的 level 對應。可取如下值:  

LOG_EMERG                   緊急情況  

LOG_ALERT                   應該被立即改正的問題,如系統數據庫破壞  

LOG_CRIT                    重要情況,如硬盤錯誤  

LOG_ERR                     錯誤  

LOG_WARNING                 警告信息  

LOG_NOTICE                  不是錯誤情況,但是可能需要處理  

LOG_INFO                    情報錯誤  

LOG_DEBUG                   包含情報的信息,通常指在調試一個程序時使用 

 void closelog();  

函數說明:關閉日志設備,與文件系統調用的close類似;調用closelog也是可選擇的,它只是關閉被用於與syslog守護進程通信的描述符。  

 

由於第一次了解syslog,不知道fastcgi進程的log輸出到哪里。查了下是默認輸出到/var/log/messages(上述sample code是輸出到/var/log/user.log).但是該目錄下並沒有messages和user.log文件。

這是由於syslog的config文件沒有配置。

/etc/syslog.conf文件是Linux日記系統的配置文件。(ubuntu下為/etc/rsyslog.d/50-default.conf)

編輯/etc/rsyslog.d/50-default.conf

 
其中有這么一段
 *.=info;*.=notice;*.=warn;\
    auth,authpriv.none;\
    cron,daemon.none;\
    mail,news.none        -/var/log/messages
 
這是本來就有,卻被注釋了(有一些選項都被注釋了如LOG_USER)。現在解注釋就行.
然后重啟syslog:sudo service rsyslog restart(sudo restart rsyslog).

 寫了個簡單的sample:

 輸出結果在/var/log/user.log.如下:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM