自定义的log打印函数(C++版本,可选打印优先级,可输出到文件,可定义模块标签,可打印所在行数,函数)

log打印函数,功能如讲解如下:

1 可控制宏COUT_LEVEL决定log,输出等级,默认为3,输出ULOGE,ULOGW,ULOGI

2 可控制宏FS_IN是否输出到文件,可通过宏FILE_LEVEL决定输出等级,默认为3,文件路径为当前路径,名字默认为output.log可通过宏FILE_NAME来重新指定

3 宏LOG_TAG输出log所在的模块,可将此宏放到makefile中或.h中或.cpp赋值,

4 可变参数,类似于cout,打印时,自动打印loglevel等级,定义的LOG_TAG标签,所在行数,所在函数,后接任意参数个数及类型,例:[ERROR][NONE][65]main: 1123 num=10

详细代码;

xxx.h

log打印函数,功能如讲解如下:

1 可控制宏COUT_LEVEL决定log,输出等级,默认为3,输出ULOGE,ULOGW,ULOGI

2 可控制宏FS_IN是否输出到文件,可通过宏FILE_LEVEL决定输出等级,默认为3,文件路径为当前路径,名字默认为output.log可通过宏FILE_NAME来重新指定

3 宏LOG_TAG输出log所在的模块,可将此宏放到makefile中或.h中或.cpp赋值,

4 可变参数,类似于cout,打印时,自动打印loglevel等级,定义的LOG_TAG标签,所在行数,所在函数,后接任意参数个数及类型,例:[ERROR][NONE][65]main: 1123 num=10

详细代码;

xxx.h

#include <iostream>

#include <fstream>

#define FILE_NAME "output.log"

//#define LOG_TAG "NONE" //输出log所在的模块,可将此宏放到makefile中赋值

//#define COUT_LEVEL 2 //可配置log等级,可将此变量放到makefile文件中配置, 0:无log, 注掉使用默认log

#if defined(COUT_LEVEL) //defined而不是define

#define DEBUGLEVEL COUT_LEVEL

#else

#define DEBUGLEVEL 0x07 //默认log等级,打印 LOG_ERR LOG_WARN LOG_INFO

#endif

#define FS_IN //是否写入文件

#ifdef FS_IN

//#define FILE_LEVEL 2 //写入文件log等级

#if defined(FILE_LEVEL)

#define FSLEVEL FILE_LEVEL

#else

#define FSLEVEL 0x07 //默认log等级,打印 LOG_ERR LOG_WARN LOG_INFO

#endif

#endif

/*debug levels*/

#define LOG_ERR 0x00

#define LOG_WARN 0x01

#define LOG_INFO 0x02

#define LOG_DEBUG 0x03

#define ULOGE(x...) dprint(LOG_ERR, x)

#define ULOGW(x...) dprint(LOG_WARN, x)

#define ULOGI(x...) dprint(LOG_INFO, x)

#define ULOGD(x...) dprint(LOG_DEBUG, x)

#define dprint(level, x...) dprint_info(level, LOG_TAG, __LINE__, __FUNCTION__, x)

#ifdef FS_IN

class bufLog {

public:

std::filebuf fb;

public:

bufLog(){this->fb.open(FILE_NAME,std::ios::out); }

~bufLog(){fb.close();}

};

#endif

static const char *log_level[4] ={"ERROR", "WARN", "INFO", "DEBUG"};

//static const std::string log_level[4] ={"ERROR", "WARN", "INFO", "DEBUG"};

#ifdef FS_IN

static bufLog BufFile;

static std::ostream fos(&BufFile.fb);

#endif

template <typename T>

std::ostream &print(std::ostream &os, const T &t)

{

return os << t<<std::endl;

}

template <typename T, typename... Args>

std::ostream &print(std::ostream &os, const T &t, const Args &... rest)

{

os<< t ;

return print(os, rest...);

}

template <typename... Args>

int dprint_info(int level, const char *module, const int line, const char *pfun, const Args &... rest)

{

#ifdef FS_IN

if(0x01<<level & FSLEVEL){

fos<<"["<<log_level[level]<<"]"<<"["<<module<<"]"<<"["<<line<<"]"<<pfun<<": ";

print(fos, rest...);

}

#endif

if(DEBUGLEVEL & 0x01<<level ){

std::cout<<"["<<log_level[level]<<"]"<<"["<<module<<"]"<<"["<<line<<"]"<<pfun<<": ";

print(std::cout, rest...);

}

}

注意:由于使用了可变参数模版,打印函数实现和宏定义需要在同一个文件中,或将.cpp中的内容include到.h文件中,否则会出现找不到函数原型的编译错误。

其他:如有错误,欢迎大家指正及交流。

源码下载地址:https://download.csdn.net/download/zhouchao_0321/10674647

猜你喜欢

转载自blog.csdn.net/zhouchao_0321/article/details/82733933