超好用的log

说明一下,这里我们也可以用户自定义输出函数,通过

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);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值