📄 nljsappender.cpp
字号:
#include "nlkit/NLJSAppender.h"
#include <unistd.h>
#include "nlkit/lexical_cast.h"
#include <sstream>
using namespace std;
using namespace nlkit;
NLJSAppender::NLJSAppender(const string& filename,
NLDailyRollingSchedule schedule,
bool immediateFlush,
bool withAdorn)
{
init(filename, schedule, immediateFlush, withAdorn);
}
void NLJSAppender::init(const string& filename,
NLDailyRollingSchedule schedule,
bool immediateFlush,
bool withAdorn)
{
m_immediateFlush = immediateFlush;
m_withAdorn = withAdorn;
m_schedule = schedule;
NLTime now = NLTime::gettimeofday();
NLTime::setCalculateBeginTime(now, m_schedule);
m_filename = filename+"."+lexical_cast<string>(getpid());
m_scheduledFilename = getFilename(now);
m_nextRolloverTime = NLTime::calculateNextRolloverTime(now, m_schedule);
m_out = fopen(m_scheduledFilename.c_str(), "a");
if (m_out == NULL)
{
getErrorHandler()->error("Unable to open file: " + m_filename);
return;
}
}
NLJSAppender::~NLJSAppender()
{
destructorImpl();
}
void NLJSAppender::close()
{
rollover();
fclose(m_out);
m_out = NULL;
m_closed = true;
}
void NLJSAppender::append(const NLEvent& event)
{
if (m_out == NULL)
{
getErrorHandler()->error("file is not open: " + m_filename);
return;
}
if (NLTime::getCalculateBeginTime(event.getTimestamp(), m_schedule) >= m_nextRolloverTime)
{
rollover();
}
ostringstream os;
if (m_withAdorn)
{
if (m_schedule < DAILY) //日志切换周期大于一天,在日志中显示日期
os << event.getTimestamp().getFormattedTime("%Y-%m-%d %H:%M:%S.%%Q");
else
os << event.getTimestamp().getFormattedTime("%H:%M:%S.%%Q");
os << " [" << getpid() ;
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());
if (m_immediateFlush)
{
fflush(m_out);
}
}
void NLJSAppender::rollover()
{
fclose(m_out);
NLTime now = NLTime::gettimeofday();
NLTime::setCalculateBeginTime(now, m_schedule);
m_scheduledFilename = getFilename(now);
m_nextRolloverTime = NLTime::calculateNextRolloverTime(now, m_schedule);
m_out = ::fopen(m_scheduledFilename.c_str(), "a");
}
string NLJSAppender::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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -