#include "StdAfx.h" #include "LogManager.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CLogManager::CLogManager(int LogID, TCHAR* NameOfMemoryMap, unsigned int ProcessID ) { CString strNameOfMemoryMap = _T(""); strNameOfMemoryMap.Format(_T("%s%02d"),NameOfMemoryMap,ProcessID); m_nProcessID = ProcessID; m_nLogID = LogID; //ÆÄÀÏ ¸ÊÇÎ »ý¼º m_hFMap = ::CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0, SHAREDMEM_SIZE,strNameOfMemoryMap); //¸¸ÀÏ ´Ù¸¥ ¾îÇø®ÄÉÀ̼ǿ¡¼­ ÀÌ¹Ì »ý¼ºÇß´Ù¸é if(::GetLastError() == ERROR_ALREADY_EXISTS) { //»ý¼ºµÈ ÆÄÀÏ ¸ÊÇÎÀ» Open m_hFMap = ::OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,strNameOfMemoryMap); } //¸ÊÇÎ ÆÄÀÏ¿¡¼­ °øÀ¯¸Þ¸ð¸® Æ÷ÀÎÅ͸¦ °¡Á®¿Â´Ù. m_pSharedMem = (char*)::MapViewOfFile(m_hFMap,FILE_MAP_ALL_ACCESS, 0,0,SHAREDMEM_SIZE); //À妽º·Î »ç¿ëÇÒ °øÀ¯ ¸Þ¸ð¸® m_nIndex = (unsigned int*)m_pSharedMem; (*m_nIndex) = 0; m_pSharedMem += 4; //Ä¿¸Çµå·Î »ç¿ëÇÒ °øÀ¯¸Þ¸ð¸® m_Command1 =(unsigned char*)m_pSharedMem; *m_Command1 = 0; //3byte ¿¹¾à °ø°£ //Ç×ÈÄ Ä¿¸Çµå Ãß°¡·Î »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. m_pSharedMem += 4; //Å©¸®Æ¼Äà ¼½¼Ç ÃʱâÈ­ m_csMemoryMap = CreateMutex(NULL, FALSE, _T("DIT_LOGVIEW_MUTEX")); InitializeCriticalSection(&m_csLocalLogFile); } CLogManager::~CLogManager(void) { //Å©¸®Æ¼Äà ¼½¼Ç ¼Ò¸ê CloseHandle(m_csMemoryMap); DeleteCriticalSection(&m_csLocalLogFile); //À妽º¿Í Ä¿¸Çµå °ø°£À» µÇµ¹¸°´Ù. m_pSharedMem -= 8; //UnMap ÇÑ´Ù. if( m_pSharedMem != NULL) ::UnmapViewOfFile(m_pSharedMem); if( m_hFMap != NULL) ::CloseHandle(m_hFMap); } void CLogManager::WriteLog( unsigned int Level, TCHAR* str,...) { WaitForSingleObject(m_csMemoryMap, INFINITE); memset(m_TempLog,0x00, sizeof(TCHAR)*MAX_STRING_SIZE*2); va_list arg; va_start(arg, str); PDITLOG ptrLog; //unsigned int* ptrLevel; unsigned int index = 0; index = (*m_nIndex)%SHARED_LOG_COUNT; ptrLog = (PDITLOG)(m_pSharedMem+(index*ONE_LOG_SIZE)); // ptrLog->nLogID = m_nLogID; ptrLog->nLogID = Level; //·Î±× ·¹º§ ÀúÀå ptrLog->nLevel = Level; //¿¹¾àµ¥ÀÌÅÍ // ptrLog->nProcess = m_nProcessID; ptrLog->nProcess = Level; //·Î±× ½Ã°£ ÀúÀå GetLocalTime(&(ptrLog->nCurTime)); //±âÁ¸ ·Î±× ÃʱâÈ­ memset(ptrLog->logMessage,0x00,sizeof(TCHAR)*MAX_STRING_SIZE); //½Å±Ô ·Î±× ³»¿ë ÀúÀå _vstprintf_s(m_TempLog, MAX_STRING_SIZE*2, str, arg); memcpy(ptrLog->logMessage,m_TempLog,sizeof(TCHAR)*(MAX_STRING_SIZE-1)); //À妽º Áõ°¡ (*m_nIndex)++; ReleaseMutex(m_csMemoryMap); } void CLogManager::ReadLog(TCHAR* str, unsigned int curIndex, int* curLogID, unsigned int* curLevel,unsigned int* curProcess, PSYSTEMTIME curTime) { unsigned int index = 0; PDITLOG ptrLog; index = (curIndex)%SHARED_LOG_COUNT; //Àоî¿Ã ·Î±×ÀÇ Æ÷ÀÎÅ͸¦ °¡Á®¿Â´Ù. ptrLog = (PDITLOG)(m_pSharedMem+(index*ONE_LOG_SIZE)); //·Î±× ·¹º§ °¡Á®¿Â´Ù. *curLevel = ptrLog->nLevel; //·Î±× ¾ÆÀ̵𸦠°¡Á®¿Â´Ù. *curLogID = ptrLog->nLogID; //ÇÁ·Î¼¼½º id ¿¹¾à¿µ¿ª µ¥ÀÌÅÍ *curProcess = ptrLog->nProcess; //·Î±×½Ã°£ °¡Á®¿Â´Ù. memcpy( curTime, &(ptrLog->nCurTime), sizeof(SYSTEMTIME)); //·Î±×¹®ÀÚ¿­ °¡Á®¿Â´Ù. memcpy( str, ptrLog->logMessage, MAX_STRING_SIZE*sizeof(TCHAR)); } //ÀÌ ÇÔ¼ö´Â °¡±ÞÀû »ç¿ëÇÏÁö ¾Ê´Â °ÍÀÌ ÁÁ½À´Ï´Ù. void CLogManager::WriteLocalLog(TCHAR* str,...) { //»ç¿ë ¾îÇø®ÄÉÀ̼ǿ¡¼­ ·ÎÄ÷Π¹Ù·Î ·Î±× ÆÄÀÏÀ» ÀÛ¼ºÇÕ´Ï´Ù. va_list list; TCHAR szText[MAX_STRING_SIZE] = {0, }; va_start(list, str); _vstprintf_s(szText, str, list); va_end(list); // ÆÄÀÏ¿¡ ¾²±â SYSTEMTIME st; GetLocalTime(&st); static TCHAR strMessage[MAX_STRING_SIZE]; memset(strMessage, 0x00, MAX_STRING_SIZE*sizeof(TCHAR)); _stprintf_s(strMessage, _T("[%02d:%02d:%02d] %s\r\n"), st.wHour, st.wMinute, st.wSecond, szText); //·Î±× ÆÄÀϸí°ú À§Ä¡ »ý¼º static TCHAR strFileName[MAX_PATH]; memset(strFileName, 0x00, MAX_PATH*sizeof(TCHAR)); _stprintf_s(strFileName, _T("%sLocal%d%02d%02d.log"), LOG_FILE_PATH, st.wYear, st.wMonth, st.wDay); DWORD dwWritten; HANDLE hFile; //°æÀï»óÅ ¹æÁö¸¦ À§ÇÑ Å©¸®Æ¼Äà °´Ã¼ »ç¿ë EnterCriticalSection(&m_csLocalLogFile); hFile = CreateFile(strFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); int nFilePointer = SetFilePointer(hFile, 0, NULL, FILE_END); #ifdef UNICODE if(!nFilePointer) { // À¯´ÏÄÚµå ÆÄÀÏÀÇ ½ÃÀÛÀº BOM(0xFEFF) À̾î¾ß ÇÑ´Ù. TCHAR strCommand = 0xFEFF; WriteFile(hFile, &strCommand, sizeof(TCHAR), &dwWritten, NULL); } #endif //·ÎÄà ·Î±×ÆÄÀÏ ÀÛ¼º WriteFile(hFile, strMessage, _tcslen(strMessage)*sizeof(TCHAR), &dwWritten, NULL); CloseHandle(hFile); LeaveCriticalSection(&m_csLocalLogFile); } void CLogManager::SaveBinary(TCHAR* FilePath) { // ÆÄÀÏ¿¡ ¾²±â SYSTEMTIME st; GetLocalTime(&st); //ÆÄÀÏ °æ·Î »ý¼º static TCHAR strFileName[MAX_PATH]; memset(strFileName, 0x00, MAX_PATH*sizeof(TCHAR)); _stprintf_s(strFileName, _T("%s%d%02d%02d-%02d%02d%02d.map"), FilePath, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); DWORD dwWritten; HANDLE hFile; //¹ÙÀ̳ʸ® ¸ÊÀ» °¡Á®¿É´Ï´Ù. char* ptrMap = GetMapDataAddress(); EnterCriticalSection(&m_csLocalLogFile); hFile = CreateFile(strFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); int nFilePointer = SetFilePointer(hFile, 0, NULL, FILE_END); //64K ¹ÙÀ̳ʸ® µ¥ÀÌÅ͸¦ ÆÄÀÏ¿¡ ÀúÀåÇÕ´Ï´Ù. WriteFile(hFile, ptrMap, DIT_MAP_SIZE, &dwWritten, NULL); CloseHandle(hFile); LeaveCriticalSection(&m_csLocalLogFile); } void CLogManager::GetFirstCommand(unsigned char* pCommand) { //Ä¿¸Çµå°ªÀ» ¾ò¾î¿É´Ï´Ù. *pCommand = *m_Command1; } void CLogManager::SetFirstCommand(unsigned char Command) { //Ä¿¸Çµå °ªÀ» ÁöÁ¤ÇÕ´Ï´Ù. *m_Command1 = Command; }