写交易所CTP代码发现里面有一个宏LOG,接收不定参数并将之打印.而平时自己的代码是用log4cplus写的,准备将LOG通过底层处理交由log4cplus接管.
原始的LOG定义比较简单:
#define LOG(format, ...) fprintf(logfile, format, __VA_ARGS__); printf(format, __VA_ARGS__); fflush(logfile);在外部定义一个文件,然后支持不定参数,将之打印到文件中完事.
如果需要将之交由log4cplus执行的话,意味着需要先将不定参数解决,然后log4cplus才能处理.
先设计一个全局函数,将不定参数转成str
std::string LogWrite(const char *format, ...) { va_list pArgs; va_start(pArgs, format); size_t nLength = vsnprintf(NULL, 0, format, pArgs) + 1; va_end(pArgs); char * p = NULL; char buf[2048] = { 0 }; if (nLength > sizeof(buf)) { char * new_buf = new char[nLength]; memset(new_buf, 0, nLength); p = new_buf; } else { memset(buf, 0, sizeof(buf)); p = buf; } va_list plist; va_start(plist, format); vsnprintf(p, nLength, format, plist); va_end(plist); std::string str = p; if (nLength > sizeof(buf)) delete[]p; return str; }然后设计一个宏函数:此函数接口为不定参数,然后通过调用不定参数LogWrite得到转换的str,并调用LOG_INFO将str交由log4cplus去执行.
#define WRITE_LOG(FMT, ...)\ {\ std::string str = LogWrite(FMT, ##__VA_ARGS__);\ LOG_INFO(str);\ }最后设计用户接口LOG
# define LOG(FMT, ...) WRITE_LOG(FMT, ##__VA_ARGS__)功能完成.此设计在vs2015, linux gcc4.8.5均编译通过.
参考:
https://www.cnblogs.com/wjshan0808/p/8409773.html, 这儿宏调试日志有所启发
https://gitee.com/sollyu/EasyLog/blob/master/EasyLog.h 简单日志