DBD-cubrid
view release on metacpan or search on metacpan
cci-src/src/cci/cci_log.cpp view on Meta::CPAN
virtual void open();
virtual void close();
virtual void write(const char *msg);
virtual void flush();
protected:
virtual void roll() = 0;
virtual bool isRolling() = 0;
std::string rename(const char *newPath, const char *postfix);
int getLogSizeKBytes();
std::string getCurrDate();
std::string getCurrDateTime();
void makeLogDir();
private:
void checkFileIsOpen();
protected:
std::ofstream out;
long int nextCheckTime;
};
class _PostFixAppender : public _LogAppenderBase
{
public:
_PostFixAppender(const _LoggerContext &context, CCI_LOG_POSTFIX postfix);
virtual ~_PostFixAppender() {}
virtual void open();
protected:
virtual void roll();
virtual bool isRolling();
private:
void checkFileIsOpen();
std::string getNewPath();
private:
CCI_LOG_POSTFIX postfix;
int prevDate;
};
class _MaxSizeLogAppender : public _LogAppenderBase
{
public:
_MaxSizeLogAppender(const _LoggerContext &context, int maxFileSizeKBytes,
int maxBackupCount);
virtual ~_MaxSizeLogAppender() {}
protected:
virtual void roll();
virtual bool isRolling();
private:
int maxFileSizeKBytes;
int maxBackupCount;
int currBackupCount;
std::list<std::string> backupList;
};
class _DailyLogAppender : public _LogAppenderBase
{
public:
_DailyLogAppender(const _LoggerContext &context);
virtual ~_DailyLogAppender() {}
protected:
virtual void roll();
virtual bool isRolling();
private:
int prevDate;
};
struct _LoggerContext
{
std::string path;
struct timeval now;
};
class _Logger
{
public:
_Logger(const char *path);
virtual ~_Logger();
void setLogLevel(CCI_LOG_LEVEL level);
void setUseDefaultPrefix(bool useDefaultPrefix);
void setUseDefaultNewLine(bool useDefaultNewLine);
void setForceFlush(bool isForceFlush);
void log(CCI_LOG_LEVEL level, const char *msg);
void changeMaxFileSizeAppender(int maxFileSizeKBytes, int maxBackupCount);
void changePostfixAppender(CCI_LOG_POSTFIX postfix);
public:
const char *getPath();
bool isWritable(CCI_LOG_LEVEL level);
private:
void write(const char *msg);
void logPrefix(CCI_LOG_LEVEL level);
private:
cci::_Mutex critical;
_LoggerContext context;
_LogAppender *logAppender;
CCI_LOG_LEVEL level;
bool useDefaultPrefix;
bool useDefaultNewLine;
bool isForceFlush;
int unflushedBytes;
unsigned long nextFlushTime;
};
_LogAppender::_LogAppender(const _LoggerContext &context) :
context(context)
{
}
cci-src/src/cci/cci_log.cpp view on Meta::CPAN
}
}
void _PostFixAppender::checkFileIsOpen()
{
long int currentTime = context.now.tv_sec * 1000000 + context.now.tv_usec;
if (nextCheckTime == 0 || currentTime >= nextCheckTime)
{
std::string newPath = getNewPath();
if (access(newPath.c_str(), F_OK) != 0)
{
if (out.is_open())
{
out.close();
}
try
{
open();
}
catch (...)
{
}
}
nextCheckTime = currentTime + LOG_CHECK_FILE_INTERVAL_USEC;
}
}
std::string _PostFixAppender::getNewPath()
{
std::stringstream newPath;
newPath << context.path;
if (postfix == CCI_LOG_POSTFIX_DATE)
{
newPath << "." << getCurrDate();
}
return newPath.str();
}
_MaxSizeLogAppender::_MaxSizeLogAppender(const _LoggerContext &context,
int maxFileSizeKBytes, int maxBackupCount) :
_LogAppenderBase(context), maxFileSizeKBytes(maxFileSizeKBytes),
maxBackupCount(maxBackupCount), currBackupCount(0)
{
}
void _MaxSizeLogAppender::roll()
{
std::stringstream newPath_stream;
newPath_stream << context.path << "." << getCurrDateTime();
std::stringstream postfix_stream;
postfix_stream << "(" << currBackupCount++ << ")";
std::string newPath = rename(newPath_stream.str().c_str(),
postfix_stream.str().c_str());
backupList.push_back(newPath);
if (backupList.size() > (size_t) maxBackupCount)
{
std::string remove_path = backupList.front();
backupList.pop_front();
int e = remove(remove_path.c_str());
if (e != 0)
{
perror("remove");
}
}
}
bool _MaxSizeLogAppender::isRolling()
{
return getLogSizeKBytes() > maxFileSizeKBytes;
}
_DailyLogAppender::_DailyLogAppender(const _LoggerContext &context) :
_LogAppenderBase(context), prevDate(time(NULL) / ONE_DAY)
{
}
void _DailyLogAppender::roll()
{
prevDate = context.now.tv_sec / ONE_DAY;
std::stringstream newPathStream;
newPathStream << context.path << "." << getCurrDate();
rename(newPathStream.str().c_str(), NULL);
}
bool _DailyLogAppender::isRolling()
{
int nowDay = context.now.tv_sec / ONE_DAY;
return prevDate < nowDay;
}
_Logger::_Logger(const char *path) :
logAppender(NULL), level(CCI_LOG_LEVEL_INFO), useDefaultPrefix(true),
useDefaultNewLine(true), isForceFlush(true), unflushedBytes(0),
nextFlushTime(0)
{
context.path = path;
gettimeofday(&context.now, NULL);
nextFlushTime = context.now.tv_usec + LOG_FLUSH_USEC;
logAppender = new _DailyLogAppender(context);
}
_Logger::~_Logger()
{
cci::_MutexAutolock lock(&critical);
if (logAppender != NULL)
{
delete logAppender;
}
}
void _Logger::setLogLevel(CCI_LOG_LEVEL level)
{
cci::_MutexAutolock lock(&critical);
( run in 0.580 second using v1.01-cache-2.11-cpan-39bf76dae61 )