15,466
社区成员
发帖
与我相关
我的任务
分享
#include <windows.h>
#include <fstream>
class CSynObj
{
public:
CSynObj()
{
InitializeCriticalSection(&m_cs);
}
~CSynObj()
{
DeleteCriticalSection(&m_cs);
}
void Lock()
{
EnterCriticalSection(&m_cs);
}
void UnLock()
{
LeaveCriticalSection(&m_cs);
}
private:
CRITICAL_SECTION m_cs;
};
class CLock
{
public:
CLock(CSynObj& synchobject)
:refSynchObject(synchobject)
{
refSynchObject.Lock();
}
virtual ~CLock()
{
refSynchObject.UnLock();
}
protected:
CSynObj& refSynchObject;
};
enum LOG_TARGET_E
{
LOG_TARGET_SCREEN = 1,
LOG_TARGET_FILE = 2,
};
class CLog
{
private:
~CLog();
CLog();
CLog(const CLog& rhs) {}
CLog& operator = (const CLog& rhs) {}
static CLog* m_pLog;
static CSynObj m_Lock;
std::ofstream m_OutFile;
void GetSysTime(SYSTEMTIME* lpSysTime);
void FormatAllTime(const SYSTEMTIME& refSysTime, std::string& strOut);
public:
void Write(char* pMsg, int nTarget);
static CLog* GetInstance();
// 摧毁singleton的入口
static void DestroyInstance();
};
__inline void DEBUG_MSG(LPSTR filename, int lineno, LPSTR linedesc, DWORD dwErrCode, int nOutPutTarget = LOG_TARGET_SCREEN|LOG_TARGET_FILE)
{
char cTemp[256];
sprintf( cTemp, "%lu error on %d line in %s file: %s", dwErrCode, lineno, filename, linedesc );
CLog* pLog = CLog::GetInstance();
pLog->Write( cTemp, nOutPutTarget );
}
#include "Log.h"
#include <iostream>
//#ifdef _DEBUG
//#define _CRTDBG_MAP_ALLOC
//#include <stdlib.h>
//#include "crtdbg.h"
//#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
//#endif
CLog* CLog::m_pLog = NULL;
CSynObj CLog::m_Lock;
CLog::~CLog()
{
m_OutFile.close();
}
CLog::CLog()
{
m_OutFile.open( "netdug.txt", std::ios::app );
atexit( CLog::DestroyInstance );
}
void CLog::GetSysTime(SYSTEMTIME* lpSysTime)
{
//获得系统时间
FILETIME CurFileTime;
::GetSystemTimeAsFileTime(&CurFileTime);
::FileTimeToLocalFileTime(&CurFileTime, &CurFileTime);
::FileTimeToSystemTime(&CurFileTime, lpSysTime);
}
void CLog::FormatAllTime(const SYSTEMTIME& refSysTime, std::string& strOut)
{
//系统时间转换成字符串
char cBuffer[MAX_PATH*2];
sprintf(cBuffer,"%d-%02d-%02d %02d:%02d:%02d",
refSysTime.wYear, refSysTime.wMonth, refSysTime.wDay , refSysTime.wHour , refSysTime.wMinute , refSysTime.wSecond);
strOut = cBuffer;
}
void CLog::Write(char* pMsg, int nTarget)
{
CLock Lock( CLog::m_Lock );
SYSTEMTIME Systime;
std::string strTime;
GetSysTime( &Systime );
FormatAllTime( Systime, strTime );
if( nTarget & LOG_TARGET_FILE )
m_OutFile << strTime.c_str() << ": " << pMsg << std::endl;
if( nTarget & LOG_TARGET_SCREEN )
std::cout << pMsg << std::endl;
}
CLog* CLog::GetInstance()
{
// 为提高效率,执行双次检测
if( !m_pLog )
{
CLock Lock( CLog::m_Lock );
if( !m_pLog )
m_pLog = new CLog;
}
return m_pLog;
}
void CLog::DestroyInstance()
{
delete m_pLog;
m_pLog = NULL;
}