创建log日志文件

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



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值