如何做一个能定位文件、函数、行数、分级的日志打印呢?
#include <stdio.h>
#include <stdarg.h>
#define LOG_ERROR 1
#define LOG_WARN 2
#define LOG_INFO 3
#define LOG_DEBUG 4
#define LZC_Printf(level,fmt,arg...) do{ LZC_MercuryDebug(level,__FILE__,__LINE__,__func__,fmt,##arg);} while (0)
int LZC_MercuryDebug(int level,const char* file,int line,const char* fuc,const char *fmt,...);
int LZC_MercuryDebug(int level, const char* file, int line, const char* fuc, const char* fmt, ...)
{
va_list ap;
char cache[1024] = { 0 };
char buffer[512] = { 0 };
va_start(ap, fmt);
memset(buffer, 0, sizeof(buffer));
vsnprintf(buffer, sizeof(buffer) - 1, fmt, ap);
if (level <= 5)
{
switch (level)
{
case LOG_ERROR :
sprintf_s(cache, "[error][%s, %s, %d] %s", file, fuc, line, buffer);
break;
case LOG_WARN :
sprintf_s(cache, "[warning][%s, %s, %d] %s", file, fuc, line, buffer);
break;
case LOG_INFO :
sprintf_s(cache, "[debug][%s, %s, %d] %s", file, fuc, line, buffer);
break;
case LOG_DEBUG :
sprintf_s(cache, "[info][%s, %s, %d] %s", file, fuc, line, buffer);
break;
}
printf("%s", cache);
// std::cout << cache;//在c++里面可以使用这个
}
va_end(ap);
return 0;
}
注意:arg... 与 ##arg 配对
还可以替换为... __VA_ARGS__ 根据操作系统不同