1. 程式人生 > >Libevent-日誌處理

Libevent-日誌處理

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-日誌處理