| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- #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<nLength; i++)
- {
- char szByte[4] = {0};
- _snprintf_s(szByte, 4, "%02X ", pData[i]);
- strHex += szByte;
- }
- return strHex;
- }
- CString CSimpleLog::GetHexString(LPBYTE pData, int nLength, int nLevel)
- {
- if(!m_bSaveFlag || (nLevel < m_nLevel))
- return CString();
- return GetHexString(pData, nLength);
- }
- CString CSimpleLog::GetAppDir()
- {
- char szFileName[_MAX_PATH] = {0};
- ::GetModuleFileNameA(NULL, szFileName, sizeof(szFileName));
- char drive[_MAX_DRIVE] = {0};
- char dir[_MAX_DIR] = {0};
- char filename[_MAX_FNAME] = {0};
- char ext[_MAX_EXT] = {0};
- _splitpath_s(szFileName, drive, dir, filename, ext);
- CStringA strAppDir;
- strAppDir.Format("%s%s", drive, dir);
- return CString(strAppDir);
- }
- // 获取日志文件带目录的文件名; 2015.07.08 by scz
- CString CSimpleLog::GetLogFileName( BOOL bDay /*= TRUE */ )
- {
- 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);
- }
- else
- {
- strLogName.Format(_T("%s%s_log.txt"), m_strLogDir, m_strFileName);
- }
- return strLogName;
- }
- // 打开日志文件; 2015.07.08 by scz
- BOOL CSimpleLog::OpenLogFile( void )
- {
- BOOL bResult = FALSE;
- do
- {
- STARTUPINFO si; //一些必备参数设置;
- memset( &si,0,sizeof( STARTUPINFO ) );//初始化si在内存块中的值(详见memset函数);
- si.cb = sizeof( STARTUPINFO );
- si.dwFlags = STARTF_USESHOWWINDOW;//指定wShowWindow成员有效;
- si.wShowWindow = SW_SHOW;
- PROCESS_INFORMATION pi;//必备参数设置结束;
- CString strLogName = GetLogFileName();
- CString szCommandLine = _T("notepad ") + strLogName;
- // if(!CreateProcess(TEXT("c:\\windows\\system32\\notepad.exe"),
- // NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
- if(!CreateProcess( NULL, //不在此指定可执行文件的文件名;
- (LPTSTR)(LPCTSTR)szCommandLine, //命令行参数;
- NULL, //默认进程安全性;
- NULL, //默认进程安全性;
- FALSE, //指定当前进程内句柄不可以被子进程继承;
- CREATE_NEW_CONSOLE, //为新进程创建一个新的控制台窗口;
- NULL, //使用本进程的环境变量;
- NULL, //使用本进程的驱动器和目录;
- &si, &pi))
- {
- bResult = TRUE;
- }
- else
- {
- //cout<<"Success!"<<endl;
- }
- //关掉句柄;
- CloseHandle(pi.hThread);
- CloseHandle(pi.hProcess);
- } while (0);
- return bResult;
- }
|