5、《Libevent中文帮助文档》学习笔记5:设置LibEvent库

这篇博客介绍了LibEvent库的全局设置,包括日志管理、错误处理、内存管理、线程和锁的使用、调试锁和事件的调试。详细阐述了如何自定义日志回调、启用调试日志、处理致命错误、替换内存管理函数以及检查和使用LibEvent的版本信息。此外,还讨论了线程安全和锁的调试选项。
摘要由CSDN通过智能技术生成

LibEvent在进程中有一些影响整个库的全局设置,在你调用LibEvent库中任何一个部分之前都需要进行设置,否则libEvent将会进入不一致的状态。

1 日志

LibEvent能记录内部的错误和警告日志,如果编译进日志支持功能,也会记录调试信息。默认情况下这些消息都是输出到stderr,你也可以通过提供自己的日志函数的方法来覆盖这种行为

接口

#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 需要写一个日志,都会进入到你提供的日志函数。你需要让 LibEvent 日志回到默认功能的时候只需要再次调用event_set_log_callback()并且传一个 NULL 即可。 

例子:

#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 的日志回调函数,你就可能会遇到非常奇怪和难以诊断的错误。在将来的版本中将会为一些函数移除这些限制。

通常调试日志都是禁用的,也都不会发送给日志回调函数,但是如果libEvent是编译成支持打开调试日志,你就可以手动打开调试日志。

接口

#define EVENT_DBG_NONE 0
#define EVENT_DBG_ALL 0xffffffffu
void event_enable_debug_logging(ev_uint32_t which);

大多数情况下,调试日志都是冗余、不必要、没什么用的。调用event_enable_debug_logging()使用EVENT_DBG_NONE得到默认行为,使用EVENT_DBG_ALL开启所有可支持的调试日志,未来会有更多更细的选项支持。
这些函数定义在<event2/event.h>中,首先出现是在LibEvent的1。0c版本,而event_enable_debug_logging()是在LibEvent的2.1.1-alpha版本。
在LibEvent2.0.19之前兼容性需要注意的是EVENT_LOG_*宏在此前有下面的记录:_EVENT_LOG_DEBUG,_EVENT_LOG_MSG,_EVENT_LOG_WARN,and_EVENT_LOG_ERR。这些老的命名已经废弃不用,只会仅仅用于兼容LibEvent2.18及之前的版本,这些在将来的版本都会全部移除掉。

2 处理致命错误

当LibEvent检测到一个不可恢复的致命错误(比如数据结构损坏),它的默认行为是调用exit()或abort()来退出当前运行的进程。这意味着有一个错误,要么在你的代码中,要么在LibEvent中
如果你想让你的程序更从容地应对致命错误,你可以为LibEvent提供退出时候应该调用的函数,覆盖默认行为。

接口

typedef void (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值