libevent 学习笔记<一>

         Libevent是一个编写快速可移植(portable)的非阻塞IO程序的库。主要特性有:跨平台、高速、扩展性强、方便等等。还提供了事件缓冲,http,dns等的cs实现,rpc实现。


 

Libevent 中的Log消息

Libevent可以对内部错误记录日志并发出警告,也可以记录debug消息,这需要编译的时候支持相关选项。默认这些消息写到标准错误流。你可以在你自己的日志记录函数中重写这些行为。


 接口

 

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

/* Deprecated; see note at the end of this section */
#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

typedef void (*event_log_cb)(int severity, const char *msg);

void event_set_log_callback(event_log_cb cb);

  重写libevent的日志行为,要自定义一个函数匹配event_log_cb中的标志位,并将该函数作为一个参数传递给event_set_log_callback().当Libevent需要日志消息时,将会把该消息传递到你定义的函数。通过将event_set_log_callback()中的参数置NULL,执行默认行为。

Examples

#include <event2/event.h>
#include <stdio.h>

static void discard_cb(int severity, const char *msg)
{
    /* This callback does nothing. */
}

static FILE *logfile = NULL;
static void write_to_file_cb(int severity, const char *msg)
{
    const char *s;
    if (!logfile)
        return;
    switch (severity) {
        case _EVENT_LOG_DEBUG: s = "debug"; break;
        case _EVENT_LOG_MSG:   s = "msg";   break;
        case _EVENT_LOG_WARN:  s = "warn";  break;
        case _EVENT_LOG_ERR:   s = "error"; break;
        default:               s = "?";     break; /* never reached */
    }
    fprintf(logfile, "[%s] %s\n", s, msg);
}

/* Turn off all logging from Libevent. */
void suppress_logging(void)
{
    event_set_log_callback(discard_cb);
}

/* Redirect all Libevent log messages to the C stdio file 'f'. */
void set_logfile(FILE *f)
{
    logfile = f;
    event_set_log_callback(write_to_file_cb);
}

注意

使用用户自定义的event_log_cb回调函数来唤醒Libevent函数是不安全的!例如,如果你尝试在回调函数中调用bufferevents发送一个警告消息到socket,可能会引发难以察觉的bug。


 

正常情况下debug日志是不开启的,可以手动开启。这部分暂时略过。


 Handling fatal errors


 

当Libevent遇到一个不能恢复的内部错误(比如数据结构崩溃),默认动作是调用exit()或者abort()来退出当前进程。这些错误基本上说明肯定存在一个bug:在libevent的代码中或者是用户代码中。

你可有重写libevent的行为,如果你想让自己的程序来更优雅的处理错误,可以提供一个函数供libevent调用。

typedef void (*event_fatal_cb)(int err);
void event_set_fatal_callback(event_fatal_cb cb);

  为了使用这个函数,你要首先自定义一个函数用来处理错误,并将它作为参数传递给event_set_fatal_callback()。

 

posted @ 2013-12-12 17:52  孤独的小马哥  阅读(577)  评论(0)    收藏  举报