void StopLogger() { CAutoLock logLock(&m_logLock); if (m_hLogger) { //Make sure the thread runs soon so it can finish processing SetThreadPriority(m_hLogger, THREAD_PRIORITY_NORMAL); m_bLoggerRunning = FALSE; m_EndLoggingEvent.Set(); WaitForSingleObject(m_hLogger, INFINITE); m_EndLoggingEvent.Reset(); CloseHandle(m_hLogger); m_hLogger = NULL; logFileParsed = -1; logFileDate = -1; instanceID = 0; } }
UINT CALLBACK LogThread(void* param) { TCHAR fileName[MAX_PATH]; LogPath(fileName, _T("log")); while ( m_bLoggerRunning || (m_logQueue.size() > 0) ) { if ( m_logQueue.size() > 0 ) { SYSTEMTIME systemTime; GetLocalTime(&systemTime); WIN32_FILE_ATTRIBUTE_DATA fileInformation; GetFileAttributesEx(fileName, GetFileExInfoStandard, &fileInformation); if(logFileParsed != systemTime.wDay || fileInformation.nFileSizeLow > 10485760) { LogRotate(); logFileParsed=systemTime.wDay; LogPath(fileName, _T("log")); } CAutoLock lock(&m_logFileLock); FILE* fp = _tfopen(fileName, _T("a+")); if (fp!=NULL) { SYSTEMTIME systemTime; GetLocalTime(&systemTime); wstring line = GetLogLine(); while (!line.empty()) { fwprintf_s(fp, L"%s", line.c_str()); line = GetLogLine(); } fclose(fp); } else //discard data { wstring line = GetLogLine(); while (!line.empty()) { line = GetLogLine(); } } } if (m_bLoggerRunning) { m_EndLoggingEvent.Wait(1000); //Sleep for 1000ms, unless thread is ending } else { Sleep(1); } } _endthreadex(0); return 0; }
void Log(const char *fmt, ...) { static CCritSec lock; va_list ap; va_start(ap, fmt); CAutoLock logLock(&lock); if (!m_hLogger) { m_bLoggerRunning = true; StartLogger(); } char buffer[1000]; int ret; va_start(ap, fmt); ret = vsprintf(buffer, fmt, ap); va_end(ap); if (ret < 0) return; SYSTEMTIME systemTime; GetLocalTime(&systemTime); char msg[500]; sprintf_s(msg, 500,"%02.2d-%02.2d-%04.4d %02.2d:%02.2d:%02.2d.%03.3d [%5x] %s\n", systemTime.wDay, systemTime.wMonth, systemTime.wYear, systemTime.wHour, systemTime.wMinute, systemTime.wSecond, systemTime.wMilliseconds, GetCurrentThreadId(), buffer); CAutoLock l(&m_qLock); m_logQueue.push((string)msg); m_eLog.Set(); }