最經有在看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
寫了個簡單的sample:
輸出結果在/var/log/user.log.如下:
