static void* logThread(void* arg) { assert(logger != NULL); while(logger->run) { struct LogNode* node = popLog(logger->queue); assert(node != NULL); if(node->level >= logger->level) { int n = write(logger->logFile, node->buf, node->len); assert(n == node->len); if(++logger->logCount >= logger->thresh) { close(logger->logFile); char name[70]; strncpy(name, logger->filePath, 70); snprintf(name + strlen(name), sizeof(name) - strlen(name), "_%d", ++logger->fileCount); rename(logger->filePath, name); logger->logFile = open(logger->filePath, O_CREAT | O_RDWR | O_APPEND, 0644); assert(logger->logFile >= 0); } } free(node->buf); free(node); } }
void LogerManager::run() { _runing = true; pushLog(0, LOG_LEVEL_ALARM, "----------------- log4z thread started! ----------------------------", NULL, 0); for (int i = 0; i <= _lastId; i++) { if (_loggers[i]._enable) { std::stringstream ss; ss <<"logger id=" <<i <<" key=" <<_loggers[i]._key <<" name=" <<_loggers[i]._name <<" path=" <<_loggers[i]._path <<" level=" << _loggers[i]._level <<" display=" << _loggers[i]._display; pushLog(0, LOG_LEVEL_ALARM, ss.str().c_str(), NULL, 0); } } _semaphore.post(); LogData * pLog = NULL; int needFlush[LOG4Z_LOGGER_MAX] = {0}; time_t lastCheckUpdate = time(NULL); while (true) { while(popLog(pLog)) { // _ullStatusTotalPopLog ++; //discard LoggerInfo & curLogger = _loggers[pLog->_id]; if (!curLogger._enable || pLog->_level <curLogger._level ) { delete pLog; pLog = NULL; continue; } if (curLogger._display && !LOG4Z_ALL_SYNCHRONOUS_OUTPUT) { showColorText(pLog->_content, pLog->_level); } if (LOG4Z_ALL_DEBUGOUTPUT_DISPLAY && !LOG4Z_ALL_SYNCHRONOUS_OUTPUT) { #ifdef WIN32 OutputDebugStringA(pLog->_content); #endif } if (curLogger._outfile && !LOG4Z_ALL_SYNCHRONOUS_OUTPUT) { if (!openLogger(pLog)) { delete pLog; pLog = NULL; continue; } curLogger._handle.write(pLog->_content, pLog->_contentLen); curLogger._curWriteLen += (unsigned int)pLog->_contentLen; needFlush[pLog->_id] ++; _ullStatusTotalWriteFileCount++; _ullStatusTotalWriteFileBytes += pLog->_contentLen; } else if (!LOG4Z_ALL_SYNCHRONOUS_OUTPUT) { _ullStatusTotalWriteFileCount++; _ullStatusTotalWriteFileBytes += pLog->_contentLen; } delete pLog; pLog = NULL; } for (int i=0; i<=_lastId; i++) { if (_loggers[i]._enable && needFlush[i] > 0) { _loggers[i]._handle.flush(); needFlush[i] = 0; } if(!_loggers[i]._enable && _loggers[i]._handle.isOpen()) { _loggers[i]._handle.close(); } } //! delay. sleepMillisecond(100); //! quit if (!_runing && _logs.empty()) { break; } if (_hotUpdateInterval != 0 && time(NULL) - lastCheckUpdate > _hotUpdateInterval) { updateConfig(); lastCheckUpdate = time(NULL); } } for (int i=0; i <= _lastId; i++) { if (_loggers[i]._enable) { _loggers[i]._enable = false; closeLogger(i); } } }