| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 | #include "StdAfx.h"#include "SimpleLog.h"///////////////////////////////////////////////////////////////////////////////CSimpleLog implements/////////////////////////////////////////////////////////////////////////////CCriticalSection CSimpleLog::cs;CString CSimpleLog::m_strLogDir;CString CSimpleLog::m_strFileName;BOOL CSimpleLog::m_bSaveFlag = TRUE;int CSimpleLog::m_nLevel = CSimpleLog::debug;BYTE CSimpleLog::m_nDelDay = 0;int CSimpleLog::m_nDaysNum = 0;void CSimpleLog::SetFileName(CString strFileName){	m_strFileName = strFileName;}void CSimpleLog::CreateLogDir(LPCTSTR lpszDir){	CString strLogDir;	if(lpszDir == NULL)		strLogDir = ".\\log\\";	else		strLogDir = lpszDir;	m_strLogDir = strLogDir;	DWORD dwAttr = ::GetFileAttributes(strLogDir);	if((dwAttr == -1) || ((dwAttr & FILE_ATTRIBUTE_DIRECTORY) == 0))	{		::CreateDirectory(strLogDir, NULL);	}}CString CSimpleLog::GetLevelName(int nLevel){	switch(nLevel)	{	case CSimpleLog::debug:		return  _T("debug");	case CSimpleLog::info:		return _T("info");	case CSimpleLog::warn:		return _T("warn");	case CSimpleLog::error:		return _T("error");	case CSimpleLog::fatal:		return _T("fatal");	default:		return _T("");	}}void CSimpleLog::DeleteLogFile(){	if(m_nDaysNum == 0)		return;	CTimeSpan tmSpan(m_nDaysNum, 0, 0, 0);	CTime tmDelDay = CTime::GetCurrentTime() - tmSpan;	SYSTEMTIME stDelDay;	tmDelDay.GetAsSystemTime(stDelDay);	//减少删除调用;	if(m_nDelDay != stDelDay.wDay)	{		CString strLogName;		strLogName.Format(_T("%s%s_log_%04d%02d%02d.txt"), m_strLogDir, 			m_strFileName, stDelDay.wYear, stDelDay.wMonth, stDelDay.wDay);		::DeleteFile(strLogName);		m_nDelDay = (BYTE)stDelDay.wDay;	}}void CSimpleLog::Save(CString strLog, bool bDay, int nLevel){	if (strLog.IsEmpty())		return ;	if(!m_bSaveFlag || (nLevel < m_nLevel))		return;	SYSTEMTIME st;	::GetLocalTime(&st);	CString strLogName;	if(bDay)	{		strLogName.Format(_T("%s%s_log_%04d%02d%02d.txt"),			CSimpleLog::GetAppDir() + _T("log\\"), m_strFileName, st.wYear, st.wMonth, st.wDay);		//删除以前的日志;		DeleteLogFile();	}	else	{		strLogName.Format(_T("%s%s_log.txt"), m_strLogDir, m_strFileName);	}	CString strLevel = GetLevelName(nLevel);	cs.Lock();	FILE *f;	errno_t err = fopen_s(&f,(LPCSTR)CStringA(strLogName), "a+");	if(err == 0)	{		fprintf(f, "%04d-%02d-%02d %02d:%02d:%02d %s %s\r\n", 			st.wYear, st.wMonth, st.wDay, 			st.wHour, st.wMinute, st.wSecond, strLevel, strLog);		fclose(f);	}	cs.Unlock();}void CSimpleLog::Save2(void* pdata, int nDataLen, bool bDay /*= true*/, int nLevel /*= 0*/){	if(!m_bSaveFlag || (nLevel < m_nLevel))		return;	SYSTEMTIME st;	::GetLocalTime(&st);	CString strLogName;	if(bDay)	{		strLogName.Format(_T("%s%s_log_%04d%02d%02d.txt"), 			m_strLogDir, m_strFileName, st.wYear, st.wMonth, st.wDay);		//删除以前的日志;		DeleteLogFile();	}	else	{		strLogName.Format(_T("%s%s_log.txt"), m_strLogDir, m_strFileName);	}	CString strLevel = GetLevelName(nLevel);	cs.Lock();	FILE *f;	errno_t err = fopen_s(&f, (LPCSTR)(CStringA(strLogName)), "a+");	if(err == 0)	{		fprintf(f, "%04d-%02d-%02d %02d:%02d:%02d %s ", 			st.wYear, st.wMonth, st.wDay, 			st.wHour, st.wMinute, st.wSecond, strLevel);		fwrite(pdata, 1, nDataLen, f);		fprintf(f, "\r\n");		fclose(f);	}	cs.Unlock();}void CSimpleLog::SaveLastErrorInfo(CString strFileName, int lineinfo){	LPVOID lpMsgBuf;	FormatMessage(		FORMAT_MESSAGE_ALLOCATE_BUFFER |		FORMAT_MESSAGE_FROM_SYSTEM |		FORMAT_MESSAGE_IGNORE_INSERTS,		NULL,		GetLastError(),		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language		(LPTSTR) &lpMsgBuf,		0,		NULL		);	CString strLog;	strLog.Format(_T("%s:%d:%s"), strFileName, lineinfo, (char*)lpMsgBuf);	Save(strLog, true, CSimpleLog::error);	LocalFree(lpMsgBuf);	lpMsgBuf = nullptr;}CString CSimpleLog::GetHexString(LPBYTE pData, int nLength){	CString strHex;	for(int i = 0; i<nLength; i++)	{		char szByte[4] = {0};		_snprintf_s(szByte, 4, "%02X ", pData[i]);		strHex += szByte;	}	return strHex;}CString CSimpleLog::GetHexString(LPBYTE pData, int nLength, int nLevel){	if(!m_bSaveFlag || (nLevel < m_nLevel))		return CString();	return GetHexString(pData, nLength);}CString CSimpleLog::GetAppDir(){	char szFileName[_MAX_PATH] = {0};	::GetModuleFileNameA(NULL, szFileName, sizeof(szFileName));	char drive[_MAX_DRIVE] = {0};	char dir[_MAX_DIR] = {0};	char filename[_MAX_FNAME] = {0};	char ext[_MAX_EXT] = {0};	_splitpath_s(szFileName, drive, dir, filename, ext);	CStringA strAppDir;	strAppDir.Format("%s%s", drive, dir);	return CString(strAppDir);}// 获取日志文件带目录的文件名;  2015.07.08 by scz CString CSimpleLog::GetLogFileName( BOOL bDay /*= TRUE */ ){	SYSTEMTIME st;	::GetLocalTime(&st);	CString strLogName;	if(bDay)	{		strLogName.Format(_T("%s%s_log_%04d%02d%02d.txt"), 			m_strLogDir, m_strFileName, st.wYear, st.wMonth, st.wDay);	}	else	{		strLogName.Format(_T("%s%s_log.txt"), m_strLogDir, m_strFileName);	}	return strLogName;}// 打开日志文件; 2015.07.08 by sczBOOL CSimpleLog::OpenLogFile( void ){	BOOL bResult = FALSE;	do 	{		STARTUPINFO si;		//一些必备参数设置;		memset( &si,0,sizeof( STARTUPINFO ) );//初始化si在内存块中的值(详见memset函数);		si.cb = sizeof( STARTUPINFO );		si.dwFlags = STARTF_USESHOWWINDOW;//指定wShowWindow成员有效;		si.wShowWindow = SW_SHOW;		PROCESS_INFORMATION pi;//必备参数设置结束;		CString strLogName = GetLogFileName();		CString szCommandLine = _T("notepad ") + strLogName;		// 	if(!CreateProcess(TEXT("c:\\windows\\system32\\notepad.exe"),		// 		NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))		if(!CreateProcess( NULL, //不在此指定可执行文件的文件名;			(LPTSTR)(LPCTSTR)szCommandLine, //命令行参数;			NULL,		//默认进程安全性;			NULL,		//默认进程安全性;			FALSE,		//指定当前进程内句柄不可以被子进程继承;			CREATE_NEW_CONSOLE, //为新进程创建一个新的控制台窗口;			NULL,		//使用本进程的环境变量;			NULL,		//使用本进程的驱动器和目录;			&si, &pi))		{			bResult = TRUE;		}		else		{			//cout<<"Success!"<<endl;		}		//关掉句柄;		CloseHandle(pi.hThread);		CloseHandle(pi.hProcess);	} while (0);	return bResult;}
 |