LINUX下執行的程式除了自己輸出系統日誌到特定檔案外,還可以透過 syslogd來達成這個功能,免除了自行開檔關檔的工作。
程式要使用系統日誌功能,只需要在程式啟動時使用openlog函數來連接syslogd程式,後面隨時用syslog函數傳人系統日誌就行了。
相關的函式有 openlog,syslog,closelog。
#include <syslog.h> void openlog(const char *ident, int option, int facility) |
開啟一個到系統日誌記錄程式的連接,開啟後就可使用用syslog或vsyslog函數在系統日誌中添加資訊 |
ident 是一個標記,ident所表示的字串將固定地加在每行日誌的前面以標識這個日誌,通常就寫成當前程式的名稱以作標記。
option 是下列值取與運算的結果: LOG_CONS LOG_NDELAY LOG_NOWAIT LOG_ODELAY LOG_PERROR LOG_PID
|
#include <syslog.h> void syslog(int priority, const char *format, ...) |
把日誌消息發給系統程式輸出至syslogd記錄 |
priority 日誌消息的緊急級別 LOG_USER A miscellaneous user process Mail A miscellaneous system daemon Security (authorization) Syslog Central printer Network news (e.g. Usenet) UUCP Cron and At Private security (authorization) Ftp server Locally defined Locally defined Locally defined Locally defined Locally defined Locally defined Locally defined Locally defined
format 日誌消息的格式,之後是格式對應的參數類似printf函數。 |
#include <syslog.h> void closelog(void) |
關閉 開啟的 openlog 連接 |
#include <stdarg.h> void vsyslog(int priority, const char *format, va_list ap); |
把日誌消息發給系統程式輸出至syslogd記錄 |
簡單範例
#include <syslog.h> int main(int argc, char **argv) return 0; |
結果輸出一般是 /var/log/messages 或是 /var/log/syslog
視 /etc/syslog.conf 中的設定,下面的設定是輸出至 /var/log/messages
# Log all kernel messages to the console. # Log anything (except mail) of level info or higher. # The authpriv file has restricted access. # Log all the mail messages in one place.
# Everybody gets emergency messages # Save news errors of level crit and higher in a special file. # Save boot messages also to boot.log |
補充
Linux有關syslog的函式沒有提供syslog寫到遠端syslogd的功能,如果在程式中想要將syslog寫到遠端的syslog 伺服器,可以使用socket udp(514)的函式,將訊息送出。
參考資料
http://insecure.org/sploits/aix.generic.syslogd.problem.html
http://zhoulifa.bokee.com/6104993.html
http://www.dusek.ch/manual/glibc/libc_18.html