Libevent-日志处理

Posted randyniu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Libevent-日志处理相关的知识,希望对你有一定的参考价值。

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
", 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] = ;

    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
", severity_str, msg);
    }
}

从上面的代码中可以看到,所有API函数都会调用 _warn_helper 函数,而该函数,在最后对调用 event_log  之前会进行简单的参数个数的检查。

源文件:  libevent-1.4.15/ log.c  log.h 

以上是关于Libevent-日志处理的主要内容,如果未能解决你的问题,请参考以下文章

python常用代码片段总结

libevent::日志

libevent和基于libevent的网络编程

使用 libevent2 处理文件 I/O 的问题

argparse 代码片段只打印部分日志

在同一个套接字中使用 libevent 处理 HTTP 和 HTTPS 请求