Libevent-日誌處理
阿新 • • 發佈:2018-08-12
span 輸出 ons tar style code char list null
Libevent的日誌默認輸出是stdout,但是可以通過設置回調函數,將日誌保存到文件中去。
static event_log_cb log_fn = NULL; void event_set_log_callback(event_log_cb cb) { log_fn = cb; }
上面是一個全局的回調函數,需要定制回調函數的時候調用一下 event_set_log_callback 方法就可以設置成為對應的回調函數。
static void event_log(int severity, const char* msg) { if (log_fn) log_fn(severity, msg);else { const char* severity_str; switch (severity) { case _EVENT_LOG_DEBUG: severity_str = "debug"; break; case _EVENT_LOG_MSG: severity_str = "msg"; break; case _EVENT_LOG_WARN: severity_str = "warn"; break; case _EVENT_LOG_ERR: severity_str = "err"; break; default: severity_str = "???"; break; } (void)fprintf(stderr, "[%s] %s\n", severity_str, msg); } }
在 log_fn 不為空的時候,就調用該回調函數,否則就使用系統默認的回回調函數,也就是直接打印輸出到屏幕上面去。
Libevent 對外提供的API
void event_err(int eval, const char* fmt, ...) EV_CHECK_FMT(2, 3); void event_warn(const char* fmt, ...) EV_CHECK_FMT(1, 2); void event_errx(int eval, const char* fmt, ...) EV_CHECK_FMT(2, 3); void event_warnx(const char* fmt, ...) EV_CHECK_FMT(1, 2); void event_msgx(const char* fmt, ...) EV_CHECK_FMT(1, 2); void _event_debugx(const char* fmt, ...) EV_CHECK_FMT(1, 2);
static void _warn_helper(int severity, int log_errno, const char* fmt, va_list ap); static void event_log(int severity, const char* msg); void event_err(int eval, const char* fmt, ...) { va_list ap; va_start(ap, fmt); _warn_helper(_EVENT_LOG_ERR, errno, fmt, ap); va_end(ap); exit(eval); } void event_warn(const char* fmt, ...) { va_list ap; va_start(ap, fmt); _warn_helper(_EVENT_LOG_WARN, errno, fmt, ap); va_end(ap); } void event_errx(int eval, const char* fmt, ...) { va_list ap; va_start(ap, fmt); _warn_helper(_EVENT_LOG_ERR, -1, fmt, ap); va_end(ap); exit(eval); } void event_warnx(const char* fmt, ...) { va_list ap; va_start(ap, fmt); _warn_helper(_EVENT_LOG_WARN, -1, fmt, ap); va_end(ap); } void event_msgx(const char* fmt, ...) { va_list ap; va_start(ap, fmt); _warn_helper(_EVENT_LOG_MSG, -1, fmt, ap); va_end(ap); } void _event_debugx(const char* fmt, ...) { va_list ap; va_start(ap, fmt); _warn_helper(_EVENT_LOG_DEBUG, -1, fmt, ap); va_end(ap); } static void _warn_helper(int severity, int log_errno, const char* fmt, va_list ap) { char buf[1024]; size_t len; if (fmt != NULL) evutil_vsnprintf(buf, sizeof(buf), fmt, ap); else buf[0] = ‘\0‘; if (log_errno >= 0) { len = strlen(buf); if (len < sizeof(buf) - 3) { evutil_snprintf(buf + len, sizeof(buf) - len, ": %s", strerror(log_errno)); } } event_log(severity, buf); } static event_log_cb log_fn = NULL; void event_set_log_callback(event_log_cb cb) { log_fn = cb; } static void event_log(int severity, const char* msg) { if (log_fn) log_fn(severity, msg); else { const char* severity_str; switch (severity) { case _EVENT_LOG_DEBUG: severity_str = "debug"; break; case _EVENT_LOG_MSG: severity_str = "msg"; break; case _EVENT_LOG_WARN: severity_str = "warn"; break; case _EVENT_LOG_ERR: severity_str = "err"; break; default: severity_str = "???"; break; } (void)fprintf(stderr, "[%s] %s\n", severity_str, msg); } }
從上面的代碼中可以看到,所有API函數都會調用 _warn_helper 函數,而該函數,在最後對調用 event_log 之前會進行簡單的參數個數的檢查。
源文件: libevent-1.4.15/ log.c log.h
Libevent-日誌處理