码迷,mamicode.com
首页 > 其他好文 > 详细

Libevent-日志处理

时间:2018-08-12 15:32:25      阅读:457      评论:0      收藏:0      [点我收藏+]

标签: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 

Libevent-日志处理

标签:std   设置   color   strerror   def   out   path   end   oid   

原文地址:https://www.cnblogs.com/randyniu/p/9462938.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!