參考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] = '