void CLogerManager::Run() { m_bRuning = true; m_loggers[LOG4Z_MAIN_LOGGER_ID]._enable = true; PushLog(0, LOG_LEVEL_ALARM, "----------------- log4z thread started! ----------------------------"); for (int i=0; i<LOG4Z_LOGGER_MAX; i++) { if (m_loggers[i]._enable) { std::stringstream ss; ss <<"logger id=" <<i <<" path=" <<m_loggers[i]._path <<" name=" <<m_loggers[i]._name <<" level=" << m_loggers[i]._level <<" display=" << m_loggers[i]._display; PushLog(0, LOG_LEVEL_ALARM, ss.str().c_str()); } } m_semaphore.Post(); LogData * pLog = NULL; char *pWriteBuf = new char[LOG4Z_LOG_BUF_SIZE + 512]; int needFlush[LOG4Z_LOGGER_MAX] = {0}; while (true) { while(PopLog(pLog)) { // m_ullStatusTotalPopLog ++; //discard LoggerInfo & curLogger = m_loggers[pLog->_id]; if (!curLogger._enable || pLog->_level <curLogger._level ) { delete pLog; pLog = NULL; continue; } //update file if (LOG4Z_ALL_WRITE_TO_FILE) { bool sameday = IsSameDay(pLog->_time, curLogger._curFileCreateTime); bool needChageFile = curLogger._curWriteLen > curLogger._limitsize*1024*1024; if (!curLogger._handle.IsOpen() || !sameday || needChageFile) { if (!sameday) { curLogger._curFileIndex = 0; curLogger._curWriteLen = 0; } else if ( needChageFile) { curLogger._curFileIndex ++; curLogger._curWriteLen = 0; } curLogger._curFileCreateTime = pLog->_time; if (!OpenLogger(pLog->_id)) { curLogger._enable = false; delete pLog; pLog = NULL; ShowColorText("log4z: Run can not update file, open file false! \r\n", LOG_LEVEL_FATAL); continue; } } } //record tm tt; if (!TimeToTm(pLog->_time, &tt)) { memset(&tt, 0, sizeof(tt)); } sprintf(pWriteBuf, "%d-%02d-%02d %02d:%02d:%02d.%03d %s %s \r\n", tt.tm_year+1900, tt.tm_mon+1, tt.tm_mday, tt.tm_hour, tt.tm_min, tt.tm_sec, pLog->_precise, LOG_STRING[pLog->_level], pLog->_content); if (LOG4Z_ALL_WRITE_TO_FILE) { size_t writeLen = strlen(pWriteBuf); curLogger._handle.Write(pWriteBuf, writeLen); curLogger._curWriteLen += (unsigned int)writeLen; needFlush[pLog->_id] ++; m_ullStatusTotalWriteFileCount++; m_ullStatusTotalWriteFileBytes += writeLen; } else { size_t writeLen = strlen(pWriteBuf); m_ullStatusTotalWriteFileCount++; m_ullStatusTotalWriteFileBytes += writeLen; } if (curLogger._display && !LOG4Z_ALL_SYNCHRONOUS_DISPLAY) { ShowColorText(pWriteBuf, pLog->_level); } delete pLog; pLog = NULL; } for (int i=0; i<LOG4Z_LOGGER_MAX; i++) { if (m_loggers[i]._enable && needFlush[i] > 0) { m_loggers[i]._handle.Flush(); needFlush[i] = 0; } } //! delay. SleepMillisecond(100); //! quit if (!m_bRuning && m_logs.empty()) { break; } } for (int i=0; i<LOG4Z_LOGGER_MAX; i++) { if (m_loggers[i]._enable) { m_loggers[i]._enable = false; m_loggers[i]._handle.Close(); } } delete []pWriteBuf; pWriteBuf = NULL; }
virtual void Run() { m_bRuning = true; PushLog(GetMainLogger(), LOG_LEVEL_ALARM, "----------------- log4z thread started! ----------------------------"); for (int i=0; i<LOGGER_MAX; i++) { if (m_loggers[i]._enable) { std::stringstream ss; ss <<" logger id=" <<i <<" path=" <<m_loggers[i]._path <<" name=" <<m_loggers[i]._name <<" level=" << m_loggers[i]._level <<" display=" << m_loggers[i]._display; PushLog(GetMainLogger(), LOG_LEVEL_ALARM, ss.str().c_str()); } } m_semaphore.Post(); LogData * pLog = NULL; #ifdef WIN32 char text[LOG_BUF_SIZE+MAX_PATH+512] = {0}; #else char text[LOG_BUF_SIZE+PATH_MAX+512] = {0}; #endif int needFlush[LOGGER_MAX] = {0}; int maxCount = 0; while (true) { while(PopLog(pLog)) { //discard if (!m_loggers[pLog->_id]._enable || pLog->_level <m_loggers[pLog->_id]._level ) { delete pLog; pLog = NULL; continue; } //update file if (!m_loggers[pLog->_id]._handle.is_open() || !m_loggers[pLog->_id]._handle.good() || !IsSameDay(pLog->_time, m_loggers[pLog->_id]._filetime)) { m_loggers[pLog->_id]._filetime = pLog->_time; if (!OpenLogger(pLog->_id)) { m_loggers[pLog->_id]._enable = false; delete pLog; pLog = NULL; continue; } } //record tm tt; if (!TimeToTm(pLog->_time, &tt)) { memset(&tt, 0, sizeof(tt)); } sprintf(text, "%d-%02d-%02d %02d:%02d:%02d %s %s \r\n", tt.tm_year+1900, tt.tm_mon+1, tt.tm_mday, tt.tm_hour, tt.tm_min, tt.tm_sec, LOG_STRING[pLog->_level], pLog->_content); m_loggers[pLog->_id]._handle.write(text, (std::streamsize)strlen(text)); if (m_loggers[pLog->_id]._display) { ShowColorText(text, pLog->_level); } needFlush[pLog->_id] ++; maxCount++; m_ullStatusTotalWriteCount++; m_ullStatusTotalWriteBytes+=strlen(text); delete pLog; pLog = NULL; if (maxCount > 1000) { //flush maxCount = 0; for (int i=0; i<LOGGER_MAX; i++) { if (m_loggers[i]._enable && needFlush[i] > 0) { m_loggers[i]._handle.flush(); needFlush[i] = 0; } } } } //flush if (maxCount > 0) { //flush maxCount = 0; for (int i=0; i<LOGGER_MAX; i++) { if (m_loggers[i]._enable && needFlush[i] > 0) { m_loggers[i]._handle.flush(); needFlush[i] = 0; } } } //stopped if (!m_bRuning) { break; } //delay. SleepMillisecond(100); } for (int i=0; i<LOGGER_MAX; i++) { if (m_loggers[i]._enable) { m_loggers[i]._handle.close(); } } }