超好用的log
程序员文章站
2022-05-26 17:52:33
...
说明一下,这里我们也可以用户自定义输出函数,通过
event_set_log_callback()
来实现,其函数参数的格式为:
void event_log(int severity, const char *msg)
首先该log并不全面,仅实现了部分,其他的可以参照源代码自己实现:
#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);
}
}
下一篇: Python virtualenv