Example #1
0
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;

}
Example #2
0
	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();
			}
		}
	}