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 );
}