Files
Sun1602/Tools/SunAutoUpdateTool/BasicLog.cpp
T
2022-10-26 12:25:11 +08:00

186 lines
3.7 KiB
C++

#include "StdAfx.h"
#include ".\basiclog.h"
#include "process.h"
CBasicLog::CBasicLog(void)
{
m_strFilePath = "";
m_bRunFileLog = false;
m_hFileLogThread = NULL;
m_hFile = NULL;
ZeroMemory( m_szNowTime, MAX_TIME_SIZE );
InitializeCriticalSection(&m_csFileLog);
}
CBasicLog::~CBasicLog(void)
{
CloseLog();
}
BOOL CBasicLog::Init( TCHAR* pszFilePath, TCHAR* pszFileName )
{
BOOL bRet = true;
m_strFilePath = pszFilePath;
m_strFilePath += "Log\\";
m_strFileName = pszFileName;
//Log파일을 담을 폴더를 생성한다.
CreateDirectory( m_strFilePath.data(), NULL );
m_bRunFileLog = TRUE;
CreateFileLogThread();
return bRet;
}
BOOL CBasicLog::InsertMessage( TCHAR* pszMsg )
{
if( m_bRunFileLog == FALSE )
return FALSE;
string strMsg;
TCHAR szTime[MAX_TIME_SIZE];
WZTime::GetTime(1, szTime, MAX_TIME_SIZE);
strMsg = "[";
strMsg += szTime; //시간을 넣는다.
strMsg += "] ";
strMsg += pszMsg; //메세지를 넣는다.
strMsg += "\r\n"; //개행문자를 넣는다.
EnterCriticalSection( &m_csFileLog );
m_listFileMsg.push_back(strMsg);
LeaveCriticalSection( &m_csFileLog );
return true;
}
BOOL CBasicLog::CreateFileLogThread()
{
unsigned int dwThreadID = 2;
m_hFileLogThread = (HANDLE)_beginthreadex(NULL, 0, FileLogThread, (void*)this, 0, &dwThreadID);
if( m_hFileLogThread == NULL )
return false;
return true;
}
// 파일에 Log 파일 출력
BOOL CBasicLog::OutputFileLog()
{
while( m_bRunFileLog == TRUE )
{
Sleep(5);
EnterCriticalSection( &m_csFileLog );
int nSize = (int)m_listFileMsg.size();
LeaveCriticalSection( &m_csFileLog );
if( nSize <= 0)
continue;
//파일 버퍼에 있는 내용을 출력
if( CheckLogTime() == false) // 현재 시간과 저장된 시간이 다르면
CreateLogFile(); // 새로운 로그 파일을 생성한다.
for( int i = 0; i < nSize ; i++ )
{
string strMsg;
EnterCriticalSection( &m_csFileLog );
strMsg = m_listFileMsg.front();
m_listFileMsg.pop_front(); //앞부분을 삭제시킨다.
LeaveCriticalSection( &m_csFileLog );
int nCount = (int)strMsg.length();
SetFilePointer(m_hFile, 0, NULL, FILE_END);
DWORD dwWritten = 0;
BOOL bRet = WriteFile(m_hFile, strMsg.c_str(), nCount, &dwWritten, NULL);
}
}
return true;
}
//저장된 시간과 시스템 시간을 비교한다.
BOOL CBasicLog::CheckLogTime()
{
ZeroMemory( m_szNowTime, MAX_TIME_SIZE );
WZTime::GetTime(2, m_szNowTime, MAX_TIME_SIZE );
if( (m_strTime.compare( m_szNowTime ) != 0) ) //현재 시간과 시스템 시간이 다르다면
{
m_strTime = m_szNowTime; //현재시간으로 설정후 false 리턴.
return false;
}
return true;
}
//새로운 로그파일을 생성한다.
BOOL CBasicLog::CreateLogFile()
{
CloseHandle(m_hFile);
string strFileName(m_strFilePath);
TCHAR szTime[MAX_TIME_SIZE];
WZTime::GetTime(2, szTime, MAX_TIME_SIZE);
strFileName += "\\";
strFileName += m_strFileName;
strFileName += "-";
strFileName += szTime;
strFileName += ".txt";
m_hFile = CreateFile( strFileName.c_str(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
if(m_hFile == INVALID_HANDLE_VALUE)
return false;
return true;
}
int CBasicLog::GetLogCount( )
{
EnterCriticalSection( &m_csFileLog );
int nCnt = (int)m_listFileMsg.size();
LeaveCriticalSection( &m_csFileLog );
return nCnt;
}
unsigned int __stdcall FileLogThread(void* pParam)
{
CBasicLog* pLog = (CBasicLog*)pParam;
pLog->OutputFileLog();
return 1;
}
void CBasicLog::CloseLog()
{
while( m_bRunFileLog )
{
Sleep(1);
if( m_listFileMsg.size() == 0 )
m_bRunFileLog = FALSE;
}
WaitForSingleObject( m_hFileLogThread, INFINITE );
if( m_hFileLogThread != NULL )
{
CloseHandle( m_hFileLogThread );
m_hFileLogThread = NULL;
}
if( m_hFile != NULL )
{
CloseHandle( m_hFile );
m_hFile = NULL;
}
DeleteCriticalSection(&m_csFileLog);
m_listFileMsg.clear();
}