Windows Mobile 下使用 Native C++ 开发日志类
2010-02-24 20:01:00 来源:WEB开发网上面的代码用于保证只有一个对象的实例化,很多做C#的开发人员会忽略上面的代码,因为C#没有深拷贝的概念,也没有运算符重载的概念。
Logger& Logger::Instance() { static Logger oLogger; return oLogger;}
上面的代码保证线程安全以及按需实例化。我觉得这个实现模式很好,同时满足三个愿望。
日志分级管理
打印日志的时候,分级管理很重要,不同时期需要显示不同级别的日志,开发时期,可能需要Trace级别的日志,到了运行时可能只需要Error以上级别的日志了,日志分级管理能均衡时间与空间的合理利用。
通过级别管理,打印级别高于需要显示级别的日志。
if( m_enLogLevel > enLogLevel){ return;}
在打印过程中,显示级别,我在找问题的时候都是从高级往低级找。
if( 0 > fwprintf(m_hLogFile, _T("%S THR:%8.8x %s %s "), GetCurrentTime(), GetCurrentThreadId(), LogLevelStr[enLogLevel], szBuffer) ){ Dispose();}
由于这是在Windows Embedded CE和Windows Mobile平台下的实现,所以都是有Unicode的API。下面是打印的日志,包含了级别。
2010-02-24T09:17:38 THR:de428d7e TRACE FILE=[.iToday.cpp], LINE=[44]2010-02-24T09:17:39 THR:de428d7e INFO FILE=[.iToday.cpp], LINE=[47]2010-02-24T09:17:39 THR:de428d7e WARN FILE=[.iToday.cpp], LINE=[50]2010-02-24T09:17:40 THR:de428d7e ERROR FILE=[.iToday.cpp], LINE=[53]2010-02-24T09:17:40 THR:de428d7e FATAL FILE=[.iToday.cpp], LINE=[56]2010-02-24T09:17:41 THR:de428d7e WARN FILE=[.iToday.cpp], LINE=[67]2010-02-24T09:17:42 THR:de428d7e ERROR FILE=[.iToday.cpp], LINE=[70]2010-02-24T09:17:42 THR:de428d7e FATAL FILE=[.iToday.cpp], LINE=[73]
时间与线程号
在多线程环境下,打印时间和线程十分重要,这样能查线程同步问题。时间和线程号见上面的日志。
使用Logger
void LoggerTest(){ Logger::Instance().Log(LOG_TRACE, _T("FILE=[%S], LINE=[%d]"), __FILE__, __LINE__); Sleep(500); Logger::Instance().Log(LOG_INFO, _T("FILE=[%S], LINE=[%d]"), __FILE__, __LINE__); Sleep(500);
更多精彩
赞助商链接