#include "log.h"
#include <string>
#include <Shlwapi.h>
#include <stdio.h>
#include <fstream>
#pragma comment( lib, "Shlwapi.lib" )
using namespace std;
#define LOG_MSG_SIZE ( 100 * 1024 )
static wstring g_wsPath;
static wstring g_wsFileName;
static BOOL g_bIsOpen = FALSE;
static string ToStr( wstring WStr );
// **************************************************
//
// fun: 若未初始化Log文件路径,则初始化Log文件路径
//
// pa: Path Log输出文件路径,默认为NULL,则输出
// 到可指定文件当前目录下,日志文件名
// 与可执行文件名相同
//
// **************************************************
VOID LogInit( WCHAR* Path )
{
if ( NULL == Path )
{
if ( L"" == g_wsPath )
{
WCHAR* pwszPath = new WCHAR[_MAX_ENV];
ZeroMemory( pwszPath, _MAX_ENV*sizeof(WCHAR) );
GetModuleFileNameW( NULL, pwszPath, _MAX_ENV );
WCHAR* pwszTemp = wcsrchr( pwszPath, L'.' );
(*pwszTemp) = 0;
g_wsPath = pwszPath;
g_wsPath += L".log";
delete[] pwszPath;
}
}
else
{
g_wsPath = Path;
}
if ( L"" == g_wsFileName )
{
WCHAR* pwszPath = new WCHAR[_MAX_ENV];
ZeroMemory( pwszPath, _MAX_ENV*sizeof(WCHAR) );
GetModuleFileNameW( NULL, pwszPath, _MAX_ENV );
WCHAR* pwszTemp = wcsrchr( pwszPath, '\\' );
g_wsFileName = pwszPath + 1;
delete[] pwszPath;
}
}
// **************************************************
//
// fun: 输出运行流程日志
//
// pa: Func 函数名
// File 文件名
// Line 行号
// Msg 流程日志信息
//
// **************************************************
VOID LogInfo( CHAR* Func, CHAR* File, DWORD Line, const WCHAR* Msg, ... )
{
while ( g_bIsOpen )
{
Sleep(10);
}
g_bIsOpen = TRUE;
LogInit();
WCHAR* pwszMsg = new WCHAR[LOG_MSG_SIZE];
ZeroMemory( pwszMsg, LOG_MSG_SIZE*sizeof(WCHAR) );
va_list ArgsList;
va_start( ArgsList, Msg );
vswprintf( pwszMsg, LOG_MSG_SIZE, Msg, ArgsList );
va_end( ArgsList );
string sMsg = ToStr( pwszMsg );
fstream fFile;
fFile.open( g_wsPath.c_str(), ios_base::out|ios_base::app );
fFile<<"******************** Info ********************"<<endl<<endl;
fFile<<sMsg.c_str()<<endl<<endl;
fFile<<"Fun: "<<Func<<endl;
fFile<<"File: "<<File<<endl;
fFile<<"Line: "<<Line<<endl;
fFile<<"Exe: "<<g_wsFileName.c_str()<<endl<<endl;
fFile<<"******************** Info ********************"<<endl<<endl;
fFile.close();
g_bIsOpen = FALSE;
delete[] pwszMsg;
}
// **************************************************
//
// fun: 输出错误日志
//
// pa: Func 函数名
// File 文件名
// Line 行号
// Msg 流程日志信息
//
// **************************************************
VOID LogError( CHAR* Func, CHAR* File, DWORD Line, const WCHAR* Msg, ... )
{
while ( g_bIsOpen )
{
Sleep(10);
}
g_bIsOpen = TRUE;
LogInit();
WCHAR* pwszMsg = new WCHAR[LOG_MSG_SIZE];
ZeroMemory( pwszMsg, LOG_MSG_SIZE*sizeof(WCHAR) );
va_list ArgsList;
va_start( ArgsList, Msg );
vswprintf( pwszMsg, LOG_MSG_SIZE, Msg, ArgsList );
va_end( ArgsList );
string sMsg = ToStr( pwszMsg );
fstream fFile;
fFile.open( g_wsPath.c_str(), ios_base::out|ios_base::app );
fFile<<"******************** Error ********************"<<endl<<endl;
fFile<<sMsg.c_str()<<endl<<endl;
fFile<<"Fun: "<<Func<<endl;
fFile<<"File: "<<File<<endl;
fFile<<"Line: "<<Line<<endl;
fFile<<"Exe: "<<g_wsFileName.c_str()<<endl<<endl;
fFile<<"******************** Error ********************"<<endl<<endl;
fFile.close();
g_bIsOpen = FALSE;
delete[] pwszMsg;
}
// **************************************************
//
// fun: 输出错误日志
//
// pa: Func 函数名
// File 文件名
// Line 行号
// ErrCode 错误码
// Msg 流程日志信息
//
// **************************************************
VOID LogError( CHAR* Func, CHAR* File, DWORD Line, DWORD ErrCode, const WCHAR* Msg, ... )
{
while ( g_bIsOpen )
{
Sleep(10);
}
g_bIsOpen = TRUE;
LogInit();
WCHAR* pwszMsg = new WCHAR[LOG_MSG_SIZE];
ZeroMemory( pwszMsg, LOG_MSG_SIZE*sizeof(WCHAR) );
va_list ArgsList;
va_start( ArgsList, Msg );
vswprintf( pwszMsg, LOG_MSG_SIZE, Msg, ArgsList );
va_end( ArgsList );
string sMsg = ToStr( pwszMsg );
fstream fFile;
fFile.open( g_wsPath.c_str(), ios_base::out|ios_base::app );
fFile<<"******************** Error ********************"<<endl<<endl;
fFile<<sMsg.c_str()<<endl;
fFile<<"Code: "<<ErrCode<<endl<<endl;
fFile<<"Fun: "<<Func<<endl;
fFile<<"File: "<<File<<endl;
fFile<<"Line: "<<Line<<endl;
fFile<<"Exe: "<<g_wsFileName.c_str()<<endl<<endl;
fFile<<"******************** Error ********************"<<endl<<endl;
fFile.close();
g_bIsOpen = FALSE;
delete[] pwszMsg;
}
// **************************************************
//
// fun: 将Unicode字符串转换为UTF-8字符串
//
// pa: Func 函数名
// File 文件名
// Line 行号
// Msg 流程日志信息
//
// **************************************************
std::string ToStr( wstring WStr )
{
DWORD dwStrlen = WideCharToMultiByte( CP_ACP, 0, WStr.c_str(), -1, NULL, 0, NULL, NULL );
CHAR* pDest = new CHAR[dwStrlen];
dwStrlen = WideCharToMultiByte( CP_ACP, 0, WStr.c_str(), -1, pDest, dwStrlen, NULL, NULL );
string sRes = pDest;
delete[] pDest;
return sRes;
}
创建log日志文件
最新推荐文章于 2022-07-14 15:13:02 发布