首先该log并不全面,仅实现了error,其他的可以参照源代码自己实现:
#ifndef log_h_ #define log_h_ #include <stdarg.h> #include <string.h> #include <errno.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #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 typedef void (*event_log)(int severity, const char *msg) //我们主要调用他 void event_error(const char* fmt,...); void event_warnx(const char *fmt, ...); void event_msgx(const char *fmt, ...); ///下面的函数是我们内部的,我们可以单独的放入一个头文件 void _warn_helper(int severity,const char* errstr,char* fmt,va_list ap); void event_log(int severity, const char *msg); int evutil_snprintf(char* buf,int size ,char* fmt,...); int evutil_vsnprintf(char* buf,int size,char* fmt,va_list ap); #endif
.c文件的实现
#include "build_libevent_log.h" //定义全局变量 event_log func = NULL; //设置用户自定义的输出格式 void event_set_log_callback(event_log cb) { func = cb; } void event_warnx(const char *fmt, ...) { va_list ap; va_start(ap, fmt); _warn_helper(EVENT_LOG_WARN, NULL, fmt, ap); va_end(ap); } void event_msgx(const char *fmt, ...) { va_list ap; va_start(ap, fmt); _warn_helper(EVENT_LOG_MSG, NULL, fmt, ap); va_end(ap); } void event_error(const char* fmt,...) { va_list ap; va_start(ap,fmt); //这是一个代理函数,别的优先级的函数也可以调用他 _warn_helper(EVENT_LOG_ERR,strerror(errno),fmt,ap); va_end(ap); } void _warn_helper(int severity,const char* errstr,char* fmt,va_list ap) { char buf[1024]; if(fmt != NULL) { //调用字符串的拼接函数 该函数的格式为(char* buf,int size,char* fmt,va_list ap); evutil_vsnprintf(buf,sizeof(buf),fmt,ap); } if(errstr != NULL) { int len = strlen(buf); //该函数的格式为(char* buf ,int size,char* fmt,...);其实上面的函数也是我们该函数底层的实现函数 evutil_snprintf(buf + len,sizeof(buf) - len,": %s",errstr); } event_log(severity,buf); } int evutil_snprintf(char* buf,int size ,char* fmt,...) { int ret; va_list ap; va_start(ap,fmt); ret = evutil_vsnprintf(buf,size,fmt,ap); va_end(ap); return ret; } int evutil_vsnprintf(char* buf,int size,char* fmt,va_list ap) { int ret = vsnprintf(buf,size,fmt,ap); buf[size -1] = '\0'; return ret; } void event_log(int severity, const char *msg) { if(func) { func(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 = "error"; break; default: break; } fprintf(stderr, "[%s] %s\n", severity_str, msg); } }