⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nltsappender.cpp

📁 一些unix下的c/c++的util包
💻 CPP
字号:
#include "nlkit/NLTSAppender.h"
#include <dirent.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <ctype.h>
#include <unistd.h>
using namespace std;
using namespace nlkit;

NLTSAppender::NLTSAppender(const string& filename,
		NLDailyRollingSchedule schedule,
		bool immediateFlush,
		long long maxFileSize,
		int maxBackupIndex,
		bool withAdorn,
        int maxQueueSize )
	: m_schedule(schedule),
      m_immediateFlush(immediateFlush),
      m_withAdorn(withAdorn),
      m_maxBackupIndex(maxBackupIndex),
      m_maxFileSize(maxFileSize),
      m_curIdx(0)
{
	printf("now using background writer\n");
	init(filename, "a", maxQueueSize);
}

void NLTSAppender::init(const string& filename, const char* type, int maxQueueSize)
{
	m_filename = filename;
	if (m_out != NULL )
	{
		fclose( m_out );
	}
	m_out = fopen(filename.c_str(), type);
	if (m_out == NULL)
	{
		getErrorHandler()->error("Unable to open file: " + filename);
		return;
	}

	NLTime now = NLTime::gettimeofday();
	NLTime::setCalculateBeginTime(now, m_schedule);

	m_scheduledFilename = getFilename(now);
	m_nextRolloverTime = NLTime::calculateNextRolloverTime(now, m_schedule);

	m_curIdx = getCurIdx();

	if (m_curIdx == 0)
		reopen(m_scheduledFilename, "a");
	else
	{
		ostringstream newTarget;
		newTarget << m_scheduledFilename << "." << m_curIdx;
		reopen(newTarget.str(), "a");
	}

	if ( m_pTSWriter!=NULL )
	{
		delete m_pTSWriter;
	}
	m_pTSWriter = new ThreadSafeWriter( m_out, this, maxQueueSize);
}

//*
void NLTSAppender::reopen(const string& filename, const char* type)
{
	fclose(m_out);

	remove(m_filename.c_str());

	m_out = fopen(filename.c_str(), type);

	if (m_out == NULL)
	{
		getErrorHandler()->error("Unable to open file: " + filename);
		return;
	}
}
//*/

NLTSAppender::~NLTSAppender()
{
	delete m_pTSWriter;
	destructorImpl();
}

void NLTSAppender::close()
{
	fclose(m_out);
	m_out = NULL;
	m_closed = true;
}

void NLTSAppender::append(const NLEvent& event)
{
	if(m_out == NULL)
	{
		getErrorHandler()->error("appender's out is not opened");
		return;
	}

	ostringstream os;

	if (m_withAdorn)
	{

		os << event.getTimestamp().getFormattedTime("%Y-%m-%d %H:%M:%S.%%q");
		os << " [" << getpid() /*<< ":" << pthread_self() */;
        if (NULL != event.getAdornHandle())
            os << ":" << event.getAdornHandle()->message();
        os << "] " << NLLogLevelName[event.getNLLogLevel()] << " - " << event.getMessage();
        if (0 != event.getFile().size())
		{
			os << " [" << event.getFile() << ":" << event.getLine() << "]";
		}
	}
	else
	{
		os << event.getMessage();
	}

	os << endl;

	//fprintf(m_out, "%s", os.str().c_str());
	m_pTSWriter->add_message( os.str() );

    /*if (m_immediateFlush)
	{
		fflush(m_out);
	}*/
}

string NLTSAppender::getFilename(const NLTime& t) const
{
	string pattern;
	switch (m_schedule)
	{
	case MONTHLY:
		pattern = "%Y-%m";
		break;

	case WEEKLY:
		pattern = "%Y-%W";
		break;

	case DAILY:
		pattern = "%Y-%m-%d";
		break;

	case TWICE_DAILY:
		pattern = "%Y-%m-%d-%p";
		break;

	case HOURLY:
		pattern = "%Y-%m-%d-%H";
		break;

	case MINUTELY:
		pattern = "%Y-%m-%d-%H-%M";
		break;
	};

	return m_filename + "." + t.getFormattedTime(pattern, false);
}


void NLTSAppender::rollover(switchtype type)
{
	fclose(m_out);

	switch (type)
	{
		case SIZE_SWITCH:
//		case CLOSE_SWITCH:
		{
			ostringstream newTarget;
			newTarget << m_scheduledFilename << "." << ++m_curIdx;
			m_out = ::fopen(newTarget.str().c_str(), "a");
		}
		break;

		case TIME_SWITCH:
		{
			NLTime now = NLTime::gettimeofday();

			for (; now >= m_nextRolloverTime; )
			{
				m_nextRolloverTime = NLTime::calculateNextRolloverTime(m_nextRolloverTime, m_schedule);
			}

			//date:2006.3.24
			//delete by mzh
			//下面的语句多减去了1个m_schedule的数值,那样m_nextRolloverTime就<=now,就会一直触发时间切换
			//m_nextRolloverTime = NLTime::calculateNextRolloverTime(m_nextRolloverTime, m_schedule, -1);

			//date:2006.3.29
			//modify by mzh,文件名称格式应取当前时间
			m_scheduledFilename = getFilename(now);
			m_out = ::fopen(m_scheduledFilename.c_str(), "a");
			m_curIdx = 0;
		}
		break;
	}
}

int NLTSAppender::getCurIdx()
{
	string dirname("");
	string filename("");
	size_t pos = m_scheduledFilename.rfind("/");
	if (pos != string::npos)
	{
		dirname = m_scheduledFilename.substr(0, pos);
		filename = m_scheduledFilename.substr(pos+1, m_scheduledFilename.size()-pos);
	}
	else
	{
		dirname = "./";
		filename = m_scheduledFilename;
	}

	DIR* dirp = opendir(dirname.c_str());
	struct dirent *dp;

	int idx = 0;
	while ((dp = readdir(dirp)) != NULL)
	{
		char *ptr;
		if ((ptr = strstr(dp->d_name, filename.c_str())) != NULL && strlen(dp->d_name) != filename.size())
		{
			char tmp[20]; bool bFlag = true;
			snprintf(tmp, sizeof(tmp), "%s", ptr+filename.size()+1);
			for (int i=0; i<strlen(tmp); ++i)
			{
				if (isdigit(tmp[i]) == 0)
				{
					bFlag = false;
					break;
				}
			}
			if (bFlag)
				idx = max(idx, atoi(tmp));
		}
	}
	closedir(dirp);

	return idx;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -