⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 logger.cpp

📁 一个完善高效的的Wince5.0下记录log的类
💻 CPP
字号:
#include "StdAfx.h"
#include "Logger.h"


long CLogger::nLogLevel(0);
long CLogger::nLogPeriod(7);
CRITICAL_SECTION  CLogger::m_crit;

CLogger::CLogger(void)
: m_bOpened(false)
{
	::QueryPerformanceFrequency(&m_nPerfFreq);
	::InitializeCriticalSection(&m_crit);
}

CLogger::~CLogger(void)
{
	Close();
	::DeleteCriticalSection(&m_crit);
}
//! 获得日志文件
CLogger* CLogger::GetLogFile()
{
	static CLogger LogFile;

	if (LogFile.m_bOpened)
	{
		SYSTEMTIME st;
		GetLocalTime(&st);
		TCHAR szDate[9];
		_stprintf(szDate, _T("%04u%02u%02u"), st.wYear, st.wMonth, st.wDay);

		if(_tcscmp(szDate, LogFile.m_szDate) != 0)
		{
			LogFile.Close();
		}
	}

	if (!LogFile.m_bOpened)
	{
		LogFile.Open();
	}

	return &LogFile;
}
//! 清空日志文件
void CLogger::ClearLogFile(void)
{
	SYSTEMTIME st;
	GetLocalTime(&st);

	st.wHour = 0;
	st.wMilliseconds = 0;
	st.wMinute = 0;
	st.wSecond = 0;

	FILETIME ft;
	SystemTimeToFileTime(&st, &ft);

	ULARGE_INTEGER ui;
	ui.LowPart = ft.dwLowDateTime;
	ui.HighPart = ft.dwHighDateTime;
	ui.QuadPart -= (nLogPeriod-1) * 24 * 60 * 60 * 10000000ui64;
	ft.dwLowDateTime = ui.LowPart;
	ft.dwHighDateTime = ui.HighPart;	//ft是需要保留的最早日志时间


	TCHAR szFilePath[MAX_PATH];
	::GetModuleFileName(NULL, szFilePath, sizeof(szFilePath)/sizeof(TCHAR));
	LPTSTR szLastDot = _tcsrchr(szFilePath, _T('.'));
	_tcscpy(szLastDot,_T("_*_Log.txt"));

	WIN32_FIND_DATA findFileData;
	HANDLE hFind = INVALID_HANDLE_VALUE;

	hFind = FindFirstFile(szFilePath, &findFileData);
	if(hFind != INVALID_HANDLE_VALUE)
	{
		if (CompareFileTime(&findFileData.ftCreationTime, &ft) < 0)
		{
			szLastDot = _tcsrchr(szFilePath, _T('\\'));
			_tcscpy(szLastDot, _T("\\"));
			_tcscat(szFilePath, findFileData.cFileName);

			DeleteFile(szFilePath);
		}
		
		while (FindNextFile(hFind, &findFileData) != 0) 
		{
			if (CompareFileTime(&findFileData.ftCreationTime, &ft) < 0)
			{
				szLastDot = _tcsrchr(szFilePath, _T('\\'));
				_tcscpy(szLastDot, _T("\\"));
				_tcscat(szFilePath, findFileData.cFileName);

				DeleteFile(szFilePath);
			}
		}
		FindClose(hFind);
	}
}
//! 记录日志 
void CLogger::Write(LPCTSTR strLevel, LPCTSTR strType, LPCTSTR pszFormat,  ...)
{
	if (m_bOpened) 
	{

		TCHAR szBuf[1024];
		va_list args;
		va_start(args, pszFormat);
		int nSize = _vsntprintf(szBuf, sizeof(szBuf)/sizeof(TCHAR), pszFormat, args);
		va_end(args);
	
		if (nSize == -1)
		{
			return;
		}

		TCHAR szTime[33];
		GetTimeStr(szTime, sizeof(szTime)/sizeof(TCHAR));

		::EnterCriticalSection(&m_crit);

		m_file << _T("[") << szTime << _T("]") << _T("[") << strLevel << _T("]");
		
		if(strType)
		{
			m_file << _T("[") << strType << _T("]");
		}
		
		m_file << _T(" ") << szBuf << endl;
		m_file.flush();

		::LeaveCriticalSection(&m_crit);

		_tcscat(szBuf, _T("\r\n"));
		TRACE(szBuf);

	}

}
//! 打开日志
void CLogger::Open()
{
	if (!m_bOpened)
	{
		SYSTEMTIME st;
		GetLocalTime(&st);
		_stprintf(m_szDate, _T("%04u%02u%02u"), st.wYear, st.wMonth, st.wDay);


		TCHAR szFilePath[128];
		::GetModuleFileName(NULL, szFilePath, sizeof(szFilePath)/sizeof(TCHAR));
		LPTSTR szLastDot = _tcsrchr(szFilePath, _T('.'));
		_tcscpy(szLastDot,_T("_"));
		_tcscat(szFilePath, m_szDate);
		_tcscat(szFilePath, _T("_Log.txt"));

		::EnterCriticalSection(&m_crit);

		m_file.open(szFilePath, ios_base::out | ios_base::app, 0);
		if (m_file)
		{
			m_bOpened = true;
		}

		::LeaveCriticalSection(&m_crit);
	}
}
//! 关闭日志
void CLogger::Close()
{
	if (m_bOpened)
	{
		::EnterCriticalSection(&m_crit);

		m_file.close();
		m_bOpened = false;

		::LeaveCriticalSection(&m_crit);

	}
}
//! 转换TIME格式到STRING格式
void CLogger::GetTimeStr(LPTSTR strTime, size_t length)
{
	SYSTEMTIME st;
	GetLocalTime(&st);

	LARGE_INTEGER counter;
	::QueryPerformanceCounter(&counter);

	_stprintf(strTime, _T("%04u-%02u-%02u %02u:%02u:%02u (%08ums)"), st.wYear, st.wMonth, st.wDay,  st.wHour, st.wMinute, st.wSecond, counter.QuadPart*1000/m_nPerfFreq.QuadPart);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -