模塊支持三種輸出目標:標準輸出、文件、系統日志。核心接口僅三個函數:創建、寫入、釋放,通過不透明指針隱藏內部結構。
typedef enum {
LOG_STDOUT, // 標準輸出
LOG_SYSLOG, // 系統日志
LOG_FILE // 文件日志
} log_type_t;
typedef struct log_st {
log_type_t type;
FILE *file; // 文件指針或stdout
} *log_t;
配置文件中以字符串形式存儲(如"local5"),運行時轉換為系統常量LOG_LOCAL5:
static log_facility_t _log_facilities[] = {
{"local0", LOG_LOCAL0}, {"local1", LOG_LOCAL1}, /* ... */
{"local7", LOG_LOCAL7}, {NULL, -1}
};
static int _log_facility(const char *facility) {
for (log_facility_t *lp = _log_facilities; lp->facility; lp++)
if (!strcasecmp(lp->facility, facility))
return lp->number;
return -1; // 未匹配時默認LOG_LOCAL7
}
void log_write(log_t log, int level, const char *msgfmt, ...) {
if (log->type == LOG_SYSLOG) {
// 系統日志路徑:vsnprintf格式化 → syslog()
} else {
// 文件/標準輸出路徑:時間戳 + 級別 + 格式化消息 → fprintf() + fflush()
}
}
priority = facility | level,級別從高到低:LOG_EMERG → LOG_DEBUG。
log_t log = log_new(LOG_SYSLOG, "MyApp", "local5");
log_write(log, LOG_NOTICE, "應用程序啟動中,PID=%d", getpid());
log_free(log);
/etc/syslog.conf標準配置