visual C++实现MFC动态库运用debugview输出日志3:使用单例模式实现CLog类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haimianjie2012/article/details/82843782

使用单例模式实现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;
}

猜你喜欢

转载自blog.csdn.net/haimianjie2012/article/details/82843782
今日推荐