强烈推荐日志库:spdlog
日志输出的方式分为两种
1、format格式化输出
LOGI_F("test log:%s","hellow word");
2、流的方式出书
LOGI("test log:"<<"hellow word");
实现日志输出接口:
void _DebugTraceA(const char* fmt,...)
{
va_list args;
va_start(args, fmt);
int size = _vscprintf(fmt, args);
std::string strfmt(size + 1, 0);
_vsnprintf_s(&strfmt[0], strfmt.size(), strfmt.size(), fmt, args);
va_end(args);
OutputDebugStringA(strfmt.c_str());
}
void _DebugTraceW(const wchar_t* fmt,...)
{
va_list args;
va_start(args, fmt);
int size = _vscwprintf(fmt, args);
std::wstring strfmt(size + 1, 0);
_vsnwprintf_s(&strfmt[0], strfmt.size(), strfmt.size(), fmt, args);
va_end(args);
OutputDebugStringW(strfmt.c_str());
}
格式化宏:
#ifdef _UNICODE
#define LOGI_F(fmt,...) _DebugTraceW("[test]" fmt "\n",__VA_ARGS__);
#else
#define LOGI_F(fmt,...) _DebugTraceA("[test]" fmt "\n",__VA_ARGS__);
#endif
流式宏:
#ifdef _UNICODE
#define DebugTrace(info_ostream)\
{\
std::wstringstream ss;\
ss << info_ostream;\
_DebugTraceW(ss.str().c_str());\
}
#else
#define DebugTrace(info_ostream)\
{\
std::stringstream ss;\
ss << info_ostream;\
_DebugTraceA(ss.str().c_str());\
}
#endif
注意:
- 在流式输出中,unicode和ansi切换的过程中编译不会报错,但是日志可能输出不对。所以最好统一使用TCHAR
- 如果直接输出带有
%
特别字符的,请使用DebugTrace("%s","%d%d%123")
,否则会报错。例如url编码的字符