📄 nltsappender.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 + -