在项目中输出 日志信息

在不同Windows版本中输出日志信息的高效方法

情景: 近来工程中需要在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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值