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
- event_logv_
错误日志
原理和一般日志是一样的。
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);
}