使用单例模式实现CLog类
头文件:
/************************************************************************
* 功能描述:日志类.
* 其它说明:使用单例模式实现
************************************************************************/
#ifndef _LOG_
#define _LOG_
#pragma once
#include "afxmt.h"
#define LOG_SAVE_NONE 0x00
#define LOG_SAVE_HDLSO 0x01
#define LOG_SAVE_OCT 0x02
#define LOG_SAVE_TRACING_HDLSO 0x10
#define LOG_SAVE_TRACING_SMALLHDLSO 0x20
#define LOG_SAVE_TRACING_ORIGINALOCT 0x30
#define LOG_SAVE_TRACING_REGISRESULT 0x40
#ifndef MPTDLL
#define MPTEXPORT __declspec(dllimport)
#else
#define MPTEXPORT __declspec(dllexport)
#endif
class MPTEXPORT CLog
{
public:
static CLog *m_plog;
static CMutex *m_mutex;
private:
FILE * m_fp;
CLog(void);
void InitSaveImageMask();
public:
static CLog *GetInstance();
void WriteLog(LPCTSTR str, ...);
void WriteLog(CString str, ...);
~CLog(void);
bool CheckSaveDataMask(unsigned int mask);
private:
unsigned int m_nSaveImageMask;///< 保存图像掩码
};
#endif
实现文件:
#include "StdAfx.h"
#include "Log.h"
#include <share.h>
#include "debugviewhelper.h"
#include <shlwapi.h>
#include "MyDirectory.h"
CLog *CLog::m_plog = NULL;
CMutex *CLog::m_mutex = new CMutex();
CLog::CLog(void)
:m_nSaveImageMask(LOG_SAVE_NONE)
{
CMyDirectory mDirectory;
CString str = mDirectory.GetCurrentPath();
str += _T("log.txt");
m_fp = _tfsopen((LPCTSTR)str, _T("w+, ccs=UTF-8"), _SH_DENYNO);
InitSaveImageMask();
}
CLog::~CLog(void)
{
if (m_mutex != NULL)
{
delete m_mutex;
m_mutex = NULL;
}
if (m_plog != NULL)
{
delete m_plog;
m_plog = NULL;
}
}
CLog * CLog::GetInstance()
{
if (m_plog != NULL)
{
return m_plog;
}
else
{
m_mutex->Lock();
if (m_plog == NULL)
{
m_plog = new CLog();
}
m_mutex->Unlock();
return m_plog;
}
}
void CLog::WriteLog(LPCTSTR str, ...)
{
if(!m_fp || (_tcslen(str) == 0))
return;
TCHAR buffer[1024];
memset(buffer, 0, sizeof(buffer));
va_list maker;
va_start(maker, str);
_vsntprintf_s(buffer, sizeof(buffer)/sizeof(TCHAR) - 1, str, maker);
va_end(maker);
CTime tm = CTime::GetCurrentTime();
/*_ftprintf_s(m_fp, _T("%4d-%02d-%02d %02d:%02d:%02d %s\r\n"),
tm.GetYear(),
tm.GetMonth(),
tm.GetDay(),
tm.GetHour(),
tm.GetMinute(),
tm.GetSecond(),
buffer);
fflush(m_fp);*/
DI << buffer;
}
void CLog::WriteLog(CString str, ...)
{
if(!m_fp || (_tcslen(str)== 0))
return;
TCHAR buffer[1024];
va_list maker;
va_start(maker, str);
_vsntprintf_s(buffer, sizeof(str)/sizeof(TCHAR) - 1, 1024, str, maker);
va_end(maker);
CTime tm = CTime::GetCurrentTime();
_ftprintf_s(m_fp, _T("%4d-%02d-%02d %02d:%02d:%02d %s\r\n"),
tm.GetYear(),
tm.GetMonth(),
tm.GetDay(),
tm.GetHour(),
tm.GetMinute(),
tm.GetSecond(),
buffer);
fflush(m_fp);
}
void CLog::InitSaveImageMask()
{
m_nSaveImageMask = LOG_SAVE_NONE;
if (PathFileExists(_T("c:\\save_hdlso.txt")))
{
m_nSaveImageMask |= LOG_SAVE_HDLSO;
}
if (PathFileExists(_T("c:\\save_oct.txt")))
{
m_nSaveImageMask |= LOG_SAVE_OCT;
}
if(PathFileExists(_T("c:\\save_tracing_hdlso.txt")))
{
m_nSaveImageMask |= LOG_SAVE_TRACING_HDLSO;
}
if(PathFileExists(_T("c:\\save_tracing_smallhdlso.txt")))
{
m_nSaveImageMask |= LOG_SAVE_TRACING_SMALLHDLSO;
}
if(PathFileExists(_T("c:\\save_tracing_oct.txt")))
{
m_nSaveImageMask |= LOG_SAVE_TRACING_ORIGINALOCT;
}
if(PathFileExists(_T("c:\\save_tracing_regis.txt")))
{
m_nSaveImageMask |= LOG_SAVE_TRACING_REGISRESULT;
}
}
bool CLog::CheckSaveDataMask(unsigned int mask)
{
return (m_nSaveImageMask & mask) != 0 ? true : false;
}