參考glog写了现有的Logging系统。
直接有
enum LoggingEnum{
LOG_INFO,
LOG_DBBUG,
LOG_ERROR,
LOG_WARNNING,
LOG_END
};
几种等级的日志,实时刷到console上,异步延迟写到日志上,建立队列缓存日志,时间一到一起刷到file,好了,看下Logging实现:
class Active;
struct Buffer;
enum LoggingEnum{
LOG_INFO,
LOG_DBBUG,
LOG_ERROR,
LOG_WARNNING,
LOG_END
};
enum GLogColor {
COLOR_DEFAULT,
COLOR_RED,
COLOR_GREEN,
COLOR_YELLOW
};
class Logging
{
public:
Logging();
~Logging();
void WriteWithFunLine(LoggingEnum eLoggingEnum, char* fun, int line, char* msg, ...);
void WriteBuffer(Buffer*& pBuffer);
private:
INT32 CreateLogFile(LoggingEnum aLoggingEnum);
void Write(LoggingEnum eLoggingEnum, char* msg, int msgLen);
private:
FILE* m_File[LOG_END];
Active* m_pActive;
typedef boost::posix_time::ptime PTIME;
boost::atomic<BOOLEAN> m_IfCanFlush[LOG_END];
PTIME m_PrelushTime[LOG_END];
std::queue<Buffer*> m_BufferQueue[LOG_END];
};
Logging g_Logging;
string LOGPreStr[LOG_END] = {"LOG_INFO", "LOG_DBBUG", "LOG_ERROR", "LOG_WARNNING"};
#ifdef _WINDOWS
// Returns the character attribute for the given color.
WORD GetColorAttribute(GLogColor color) {
switch (color) {
case COLOR_RED: return FOREGROUND_RED;
case COLOR_GREEN: return FOREGROUND_GREEN;
case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;
default: return 0;
}
}
#else
// Returns the ANSI color code for the given color.
const char* GetAnsiColorCode(GLogColor color) {
switch (color) {
case COLOR_RED: return "1";
case COLOR_GREEN: return "2";
case COLOR_YELLOW: return "3";
case COLOR_DEFAULT: return "";
};
return NULL; // stop warning about return type.
}
#endif // OS_WINDOWS
GLogColor GLogColorVec[LOG_END] = {COLOR_GREEN, COLOR_DEFAULT, COLOR_RED, COLOR_YELLOW};
Logging::Logging(){
PTIME nowTime = boost::posix_time::microsec_clock::local_time();
INT32 n32Res = eNormal;
for (INT32 i = LOG_INFO; i < LOG_END; ++i){
m_File[i] = NULL;
m_IfCanFlush[i] = FALSE;
m_PrelushTime[i] = nowTime;
n32Res = CreateLogFile((LoggingEnum)i);
if (n32Res != eNormal){
printf("Createfile(i) failed", i);
}
}
m_pActive = Active::CreateActive(std::bind(&Logging::WriteBuffer, this, std::placeholders::_1));
}
void Logging::Write(LoggingEnum eLoggingEnum, char* msg, int msgLen){
Buffer* pBuffer = m_pActive->GetBuffer();
pBuffer->m_LogLevel = eLoggingEnum;
char* curData = pBuffer->m_pMsg;
pBuffer->m_Len = msgLen;
memcpy(curData, msg, msgLen);
m_pActive->Send(pBuffer);
}
void Logging::WriteBuffer(Buffer*& pBuffer){
char* pContent = pBuffer->m_pMsg;
pContent[pBuffer->m_Len] = '