#include "StdAfx.h" #include "SimpleLog.h" ///////////////////////////////////////////////////////////////////////////// //CSimpleLog implements ///////////////////////////////////////////////////////////////////////////// CCriticalSection CSimpleLog::cs; CString CSimpleLog::m_strLogDir; CString CSimpleLog::m_strFileName; BOOL CSimpleLog::m_bSaveFlag = TRUE; int CSimpleLog::m_nLevel = CSimpleLog::debug; BYTE CSimpleLog::m_nDelDay = 0; int CSimpleLog::m_nDaysNum = 0; void CSimpleLog::SetFileName(CString strFileName) { m_strFileName = strFileName; } void CSimpleLog::CreateLogDir(LPCTSTR lpszDir) { CString strLogDir; if(lpszDir == NULL) strLogDir = ".\\log\\"; else strLogDir = lpszDir; m_strLogDir = strLogDir; DWORD dwAttr = ::GetFileAttributes(strLogDir); if((dwAttr == -1) || ((dwAttr & FILE_ATTRIBUTE_DIRECTORY) == 0)) { ::CreateDirectory(strLogDir, NULL); } } CString CSimpleLog::GetLevelName(int nLevel) { switch(nLevel) { case CSimpleLog::debug: return _T("debug"); case CSimpleLog::info: return _T("info"); case CSimpleLog::warn: return _T("warn"); case CSimpleLog::error: return _T("error"); case CSimpleLog::fatal: return _T("fatal"); default: return _T(""); } } void CSimpleLog::DeleteLogFile() { if(m_nDaysNum == 0) return; CTimeSpan tmSpan(m_nDaysNum, 0, 0, 0); CTime tmDelDay = CTime::GetCurrentTime() - tmSpan; SYSTEMTIME stDelDay; tmDelDay.GetAsSystemTime(stDelDay); //减少删除调用; if(m_nDelDay != stDelDay.wDay) { CString strLogName; strLogName.Format(_T("%s%s_log_%04d%02d%02d.txt"), m_strLogDir, m_strFileName, stDelDay.wYear, stDelDay.wMonth, stDelDay.wDay); ::DeleteFile(strLogName); m_nDelDay = (BYTE)stDelDay.wDay; } } void CSimpleLog::Save(CString strLog, bool bDay, int nLevel) { if (strLog.IsEmpty()) return ; if(!m_bSaveFlag || (nLevel < m_nLevel)) return; SYSTEMTIME st; ::GetLocalTime(&st); CString strLogName; if(bDay) { strLogName.Format(_T("%s%s_log_%04d%02d%02d.txt"), CSimpleLog::GetAppDir() + _T("log\\"), m_strFileName, st.wYear, st.wMonth, st.wDay); //删除以前的日志; DeleteLogFile(); } else { strLogName.Format(_T("%s%s_log.txt"), m_strLogDir, m_strFileName); } CString strLevel = GetLevelName(nLevel); cs.Lock(); FILE *f; errno_t err = fopen_s(&f,(LPCSTR)CStringA(strLogName), "a+"); if(err == 0) { fprintf(f, "%04d-%02d-%02d %02d:%02d:%02d %s %s\r\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, strLevel, strLog); fclose(f); } cs.Unlock(); } void CSimpleLog::Save2(void* pdata, int nDataLen, bool bDay /*= true*/, int nLevel /*= 0*/) { if(!m_bSaveFlag || (nLevel < m_nLevel)) return; SYSTEMTIME st; ::GetLocalTime(&st); CString strLogName; if(bDay) { strLogName.Format(_T("%s%s_log_%04d%02d%02d.txt"), m_strLogDir, m_strFileName, st.wYear, st.wMonth, st.wDay); //删除以前的日志; DeleteLogFile(); } else { strLogName.Format(_T("%s%s_log.txt"), m_strLogDir, m_strFileName); } CString strLevel = GetLevelName(nLevel); cs.Lock(); FILE *f; errno_t err = fopen_s(&f, (LPCSTR)(CStringA(strLogName)), "a+"); if(err == 0) { fprintf(f, "%04d-%02d-%02d %02d:%02d:%02d %s ", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, strLevel); fwrite(pdata, 1, nDataLen, f); fprintf(f, "\r\n"); fclose(f); } cs.Unlock(); } void CSimpleLog::SaveLastErrorInfo(CString strFileName, int lineinfo) { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL ); CString strLog; strLog.Format(_T("%s:%d:%s"), strFileName, lineinfo, (char*)lpMsgBuf); Save(strLog, true, CSimpleLog::error); LocalFree(lpMsgBuf); lpMsgBuf = nullptr; } CString CSimpleLog::GetHexString(LPBYTE pData, int nLength) { CString strHex; for(int i = 0; i