예제 #1
0
파일: Logger.c 프로젝트: PangZhan/webServer
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);	
	}
}
예제 #2
0
파일: log4z.cpp 프로젝트: GarimaSinha/log4z
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);
		}
	}

}