情景: 近来工程中需要在Windows 的不同版本中进行测试,但是在一些版本中却出现了 Bug 。 不可能在每个平台下都安装环境进行调试吧,所以输出一个文件日志信息进行查看调试是最合理不过了。。
以下是一个输出日志信息的简单 Demo.. 在实际项目中可以对更多的 trace 函数进行重载更多的版本。
// 输出日志信息的 Demo
// 2014-9-30 8:44:53
#include "stdafx.h"
#include <shlobj.h>
//#define Enable_Trace_Log
//#ifdef Enable_Trace_Log
//// ...
//#else
//// ...
//#endif
#ifndef _DEBUG
// 如果是非调试的情况下,没必要输出日志信息。
// 或者自己定义一个宏,在需要的时候如上面那几行的写法进行预处理
void trace_init(){}
void trace(LPCTSTR format,...){}
#else
#include <sstream>
#include <atlstr.h> // for CString
void trace_init()
{
std::wostringstream so;
TCHAR szPath[MAX_PATH] = {0};
if (!SHGetSpecialFolderPath(NULL, szPath, CSIDL_LOCAL_APPDATA, TRUE))
{
return;
}
FILE* fp= NULL;
_tcscat(szPath, _T("\\trace.log"));
CString filter;
fp=_tfopen(szPath, _T("r, ccs=UNICODE"));
if(fp==NULL)
{
filter=_T("w, ccs=UNICODE");
}
else
{
fclose(fp);
fp=NULL;
filter=_T("a, ccs=UNICODE");
}
fp=_tfopen(szPath, filter);
//// Split Bar
for(int i=1;i<100;i++)
{
so<<L"=";
}
so<<std::endl;
so<<L"Trace Log"<<std::endl;
// Time
SYSTEMTIME st;
GetLocalTime(&st);
CString strTime;
strTime.Format(_T("%4d-%02d-%02d, %02d:%02d:%02d.%03d"), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds );
so<<strTime.GetBuffer()<<std::endl;
fwrite(so.str().c_str(),sizeof(wchar_t),so.str().length(),fp);
fclose(fp);
}
void trace(LPCTSTR format,...)
{
TCHAR szPath[MAX_PATH] = {0};
if (!SHGetSpecialFolderPath(NULL, szPath, CSIDL_LOCAL_APPDATA, TRUE))
{
return;
}
FILE* fp = NULL;
_tcscat(szPath, _T("\\trace.log"));
fp=_tfopen(szPath, _T("a, ccs=UTF-8"));
if(fp==NULL)
{
return;
}
wchar_t buffer[1024];
va_list arglist;
std::wostringstream so;
va_start ( arglist, format );
vswprintf ( buffer, 1024, format, arglist );
va_end ( arglist );
so<<buffer<<std::endl;
fwrite(so.str().c_str(),sizeof(wchar_t),so.str().length(),fp);
fclose(fp);
}
#endif // _DEBUG
int main()
{
trace_init(); // 在使用前先调用这一句,在MFC 代码中常添加到 C**App::InitInstance() 中去
trace(TEXT("test: %s"), TEXT("BenDan....."));
for (int i = 0; i < 10; ++i)
{
trace(TEXT(": %d "), i);
}
trace(TEXT("End"));
return 1;
}