标签:std 设置 color strerror def out path end oid
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
标签:std 设置 color strerror def out path end oid
原文地址:https://www.cnblogs.com/randyniu/p/9462938.html