C++输出log日志到指定路径下且达到一定大小新建文件

HANDLE					g_TraceFileHandle = INVALID_HANDLE_VALUE;//必须为成员变量或者为全局变量
std::wstring			g_TraceFilePath;						//输出路径,必须为成员变量或者为全局变量
void CChannel::XDBDebugOnly(const wchar_t* pwszFormat,...)
{
	//XDBAutoSpinLock AutoLock(_xdbTraceLock);//锁
	if( g_TraceFileHandle == INVALID_HANDLE_VALUE )
	{
		// 获得程序运行目录
		if( g_TraceFilePath.empty() )
		{
			//可以设置为获取进程所在路径
			WCHAR szAppPath[256] = { 0 } ;
// 			if( GetModuleFileNameW(NULL,szAppPath,256 )  == 0 )
// 				return;
// 
// 			// 构造合适的文件名
// 			LPWSTR pwszDot = wcsrchr( szAppPath, L'.' );
// 			pwszDot = 
// 			if( pwszDot != NULL )
// 				wcscpy( pwszDot, L".log" );
// 			else
// 				wcscat( szAppPath , L".log" );
// 
//  			LPWSTR pwszDir = wcsrchr(szAppPath, L'\\');
//  			CString strTmp = pwszDir;
// 			wcscpy( pwszDir, L"\\Log");
// 			wcscat(szAppPath, strTmp);

			wcscpy(szAppPath,L"C:\\WY.log");
			// 保存文件名
			g_TraceFilePath = szAppPath;
		}

		// 打开文件
		g_TraceFileHandle= CreateFileW( 
			g_TraceFilePath.c_str() , 
			GENERIC_WRITE , 
			FILE_SHARE_READ | FILE_SHARE_WRITE, 
			NULL , 
			OPEN_ALWAYS, 
			FILE_ATTRIBUTE_NORMAL,
			NULL );
		if( g_TraceFileHandle == INVALID_HANDLE_VALUE )
			return;
	}

	//==============================================================================
	// 检查文件大小
	//==============================================================================
	if( GetFileSize( g_TraceFileHandle,NULL ) >= /*MAX_WY_FILE_SIZE单个文件的最大4M*/ ( 4*1024*1024 ))
	{
		// 关闭文件
		CloseHandle( g_TraceFileHandle );

		// 需要备份文件
		wostringstream OldName;
		OldName << g_TraceFilePath << WSTR(".") << /*MAX_WY_FILE_NUM最大生成文件个数*/32 << ends;
		::_wremove( OldName.str().c_str());

		// 文件改名
		size_t n = g_TraceFilePath.length()+1;
		for( long Index = /*MAX_WY_FILE_NUM最大生成文件个数*/32; Index >1; Index-- )
		{
			wstring NewName = OldName.str();
			OldName.seekp( ( wostringstream::off_type )n,std::ios::beg );
			OldName << Index-1 << ends;
			::_wrename( OldName.str().c_str(),NewName.c_str() );
		}
		::_wrename( g_TraceFilePath.c_str(),OldName.str().c_str() );

		// 重新创建文件
		g_TraceFileHandle= CreateFileW( 
			g_TraceFilePath.c_str() , 
			GENERIC_WRITE , 
			FILE_SHARE_READ | FILE_SHARE_WRITE, 
			NULL , 
			OPEN_ALWAYS, 
			FILE_ATTRIBUTE_NORMAL,
			NULL );
		if( g_TraceFileHandle == INVALID_HANDLE_VALUE )
			return;
	}

	// 再次检查文件大小
	if( GetFileSize( g_TraceFileHandle,NULL ) == 0 )
	{
		DWORD Bytes = 0;
		::WriteFile( g_TraceFileHandle,/*UNICODE_BOM*/"\xFF\xFE",2,&Bytes,NULL );	
	}

	// 设置文件位置
	SetFilePointer( g_TraceFileHandle , 0L , NULL , FILE_END );

	// 记录时间
	WCHAR	   szBuffer[/*MAX_WY_BUFFER*/1024] = { 0 };//MAX_WY_BUFFER 缓冲区大小
	SYSTEMTIME localTime		= { 0 };
	GetLocalTime( &localTime );
	swprintf( szBuffer ,/*MAX_WY_BUFFER*/1024, L"[%05d-%05d] %4d-%02d-%02d %02d:%02d:%02d:%03d : ", GetCurrentProcessId(),GetCurrentThreadId(), localTime.wYear , localTime.wMonth , localTime.wDay , localTime.wHour , localTime.wMinute, localTime.wSecond, localTime.wMilliseconds );

	// 格式化字符串
	size_t Len = wcslen( szBuffer );
	va_list args;
	va_start(args, pwszFormat);
	_vsnwprintf( szBuffer+Len , /*MAX_WY_BUFFER*/1024-Len-3, pwszFormat, args);
	va_end(args);
	Len = wcslen( szBuffer );
	szBuffer[Len]   = L'\r';
	szBuffer[Len+1] = L'\n';
	szBuffer[Len+2] = L'\0';

	// 输出日志到文件
	DWORD dwBytesWritten = 0;
	WriteFile( g_TraceFileHandle , szBuffer , (DWORD)wcslen( szBuffer )*sizeof(WCHAR) , &dwBytesWritten , NULL );

}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值