Libevent

libevent配置文件和日志

Posted by Liangjf on April 14, 2019

event-config.h.cmake

用于整个项目的宏定义开关的定义。配置的时候创建,make的时候会用到。

应该在编译源码之前,先设置对应的开关。看下面的部分宏开关。

    ......
    #ifndef EVENT2_EVENT_CONFIG_H_INCLUDED_
    #define EVENT2_EVENT_CONFIG_H_INCLUDED_

    #cmakedefine EVENT__DISABLE_DEBUG_MODE 1

    #cmakedefine EVENT__DISABLE_MM_REPLACEMENT 1

    //是否支持多线程,默认是不开启多线程的。
    #cmakedefine EVENT__DISABLE_THREAD_SUPPORT 1

日志

要定制自己的日志处理函数和错误处理函数,应该在程序的一开始位置就进行定制。

日志的级别

  • #define EVENT_LOG_DEBUG 0
  • #define EVENT_LOG_MSG 1
  • #define EVENT_LOG_WARN 2
  • #define EVENT_LOG_ERR 3

  • #define _EVENT_LOG_DEBUG EVENT_LOG_DEBUG
  • #define _EVENT_LOG_MSG EVENT_LOG_MSG
  • #define _EVENT_LOG_WARN EVENT_LOG_WARN
  • #define _EVENT_LOG_ERR EVENT_LOG_ERR

设置日志回调函数,写进文件中

//全局的指针指向日志回调函数,如果设置了,那么所有的写日志都会调用日志的回调函数

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);
    }
}

使用日志函数,就是确定日志级别,还有信息就O了。

void event_err(int eval, const char *fmt, ...)
{
    va_list ap;

    va_start(ap, fmt);
    event_logv_(EVENT_LOG_ERR, strerror(errno), fmt, ap);
    va_end(ap);
    event_exit(eval);
}

void event_warn(const char *fmt, ...);
void event_sock_err(int eval, evutil_socket_t sock, const char *fmt, ...);
void event_sock_warn(evutil_socket_t sock, const char *fmt, ...);
void event_errx(int eval, const char *fmt, ...);
void event_warnx(const char *fmt, ...);
void event_msgx(const char *fmt, ...);
void event_debugx_(const char *fmt, ...);

这里,使用了可变参数设置的方法,调用的时候可以随意传参。

调用顺序:

  • event_warn
    • event_logv_
      • event_log

错误日志

原理和一般日志是一样的。

static event_fatal_cb fatal_fn = NULL;

void event_set_fatal_callback(event_fatal_cb cb)
{
    fatal_fn = cb;
}

static void event_exit(int errcode)
{
    if (fatal_fn) {
        fatal_fn(errcode);
        exit(errcode); /* should never be reached */
    } else if (errcode == EVENT_ERR_ABORT_)
        abort();
    else
        exit(errcode);
}

void event_err(int eval, const char *fmt, ...)
{
    va_list ap;

    va_start(ap, fmt);
    event_logv_(EVENT_LOG_ERR, strerror(errno), fmt, ap);	//异常退出前先打印日志
    va_end(ap);
    event_exit(eval);
}