2008年11月20日 星期四

System Log in Linux (openlog, syslog, closelog)

每當撰寫AP時, Log的工作是絕對馬虎不得, 但各個AP記錄著自己獨立的log file,
當發生問題時, AP彼此之間要對照時間及訊息時, 就是一件很麻煩的工程,
因為一個事件的引發, 其對應的作業流程卻是散佈於一連串的AP之中,
舉例來說:當客戶下訂單時, 訂單模組會建立訂單, 再通知倉儲模組,
若物料不足, 則須通知採購模組,
若物料充足, 則須通知生產製程模組, 以此類推...

有沒有什麼方法, 可以讓所有AP共同將log message記錄於同一個log file??
答案是: 有的!linux提供了syslog的 system call, 讓這類的工作變得非常簡單易用!



                    ( syslog protocol 運作圖)




#include

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

syslog(LOG_INFO,
"This is a syslog test message generated by program '%s'\n",
argv[0]);

closelog();
return 0;
}

## 連接至system logger
void openlog(const char *ident, int option, int facility);

## 產生log message
void syslog(int priority, const char *format, ...);

## 關閉連接
void closelog(void);

ident : 出現於每個log message, 通常是設為程式名稱
option :
LOG_CONS : 如果送到system logger時發生問題,直接寫入系統console
LOG_NDELAY : 立即開啟連接(通常,連接是在第一次寫入訊息時才打開的)
LOG_PERROR : 將訊息也同時送到stderr
LOG_PID : 將PID含入所有訊息中

facility : (指定程式的類型, 藉由syslog.conf決定不同的作業方式)
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 : 除錯訊息

priority : (facility | level)