#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;
|
}
|