欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

超好用的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);
	}
}