?? logger.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 + -