博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
日志库EasyLogging++学习系列(6)—— 日志记录器
阅读量:3975 次
发布时间:2019-05-24

本文共 3597 字,大约阅读时间需要 11 分钟。

所有的日志都是由日志记录器完成的,日志记录器使用唯一的 ID(大小写敏感)来标识。在 Easylogging++ 中默认了三个现有的日志记录器:

  • 默认日志记录器,其 ID 为:default
  • 性能日志记录器,其 ID 为:performance
  • 系统日志记录器,其 ID 为:syslog,需要定义宏 ELPP_SYSLOG ,否则不存在

注册日志记录器

除了上述三个默认现有的日志记录器,我们还可以注册新的日志记录器,这个在前面的《 》一文中就提到了一种方法,就是使用全局配置文件来注册。
现在介绍另外一种更通用的方法,就是使用 
el::Loggers::getLogger()函数。下面把这个函数从源码中摘录出来:
[cpp]
  1. static inline Logger* getLogger(const std::string& identity, bool registerIfNotAvailable = true) {  
  2.         base::threading::ScopedLock scopedLock(ELPP->lock());  
  3.         return ELPP->registeredLoggers()->get(identity, registerIfNotAvailable);  
  4.     }  
static inline Logger* getLogger(const std::string& identity, bool registerIfNotAvailable = true) {        base::threading::ScopedLock scopedLock(ELPP->lock());        return ELPP->registeredLoggers()->get(identity, registerIfNotAvailable);    }
函数参数说明:
  •  identity,日志记录器 ID 标识,注意大小写敏感。
  • registerIfNotAvailable,当指定 ID 的日志记录器不存在时,值为true则新建一个指定 ID 的日志记录器,并返回它的一个对象指针,值为false则返回 NULL;当指定 ID 的日志记录器已经存在时,不论该参数为何值,都返回它的一个对象指针。
所有新建的日志记录器都是使用通过默认配置功能设置好的配置,同样是详见《 》一文中的默认配置功能介绍。其实,每一个日志记录器的配置都可以是不同的,只需利用函数  
el::Loggers::reconfigureLogger()重新设置即可。
注销日志记录器
你可以注销除了默认日志记录器(ID:default)以外所有的日志记录器。不过仅仅建议你选择注销由你自己注册的并且不再使用的日志记录器,否则可能会出现意料之外的错误。你可以使用函数
el::Loggers::unregisterLogger()注销某一个日志记录器。下面是这个函数的源码:
[cpp]
  1. static inline bool unregisterLogger(const std::string& identity) {  
  2.         base::threading::ScopedLock scopedLock(ELPP->lock());  
  3.         return ELPP->registeredLoggers()->remove(identity);  
  4.     }  
static inline bool unregisterLogger(const std::string& identity) {        base::threading::ScopedLock scopedLock(ELPP->lock());        return ELPP->registeredLoggers()->remove(identity);    }
在 Easylogging++ V9.80版本中,这个函数有个错误,最终会导致程序崩溃。原因很简单,就是有个指针对象释放之后仍被使用,下面是出错的源码:
[cpp]
  1. inline void unregister(const T_Key& uniqKey) {  
  2.         T_Ptr* existing = get(uniqKey);  
  3.         if (existing != nullptr) {  
  4.             base::utils::safeDelete(existing);  
  5.             this->list().erase(uniqKey);  
  6.         }  
  7.     }  
inline void unregister(const T_Key& uniqKey) {        T_Ptr* existing = get(uniqKey);        if (existing != nullptr) {            base::utils::safeDelete(existing);            this->list().erase(uniqKey);        }    }
第四行的 existing 和第五行的 uniqKey 其实是指向同一个对象的,先 delete 后 erase 导致出错。改正的方法也很简单,只需替换两行代码顺序即可。
枚举日志记录器
你可以使用函数
el::Loggers::populateAllLoggerIds(std::vector<std::string>&)枚举日志库中所有的日志记录器。下面的代码演示了注册、注销、枚举日志记录器等功能:
[cpp]
  1. #define ELPP_STL_LOGGING    
  2. #include "easylogging++.h"  
  3.   
  4. INITIALIZE_EASYLOGGINGPP  
  5.   
  6. int main(int argc, char** argv)  
  7. {  
  8.     /// 使用一个不存在的日记记录器会输出一条错误信息  
  9.     CLOG(INFO, "testlog");  
  10.   
  11.     /// 注册一个新的日志记录器  
  12.     el::Logger* newLogger = el::Loggers::getLogger("testlog");  
  13.     CLOG(INFO, "testlog") << "this is a new logger";  
  14.   
  15.     /// 枚举日志记录器,没有定义宏 ELPP_SYSLOG,不会枚举出系统日志记录器  
  16.     std::vector<std::string> allLoggers;  
  17.     el::Loggers::populateAllLoggerIds(&allLoggers);  
  18.     LOG(INFO) << allLoggers;  
  19.   
  20.     /// 注销日志记录器  
  21.     el::Loggers::unregisterLogger("testlog");  
  22.     /// 使用一个不存在的日记记录器会输出一条错误信息  
  23.     CLOG(INFO, "testlog");  
  24.   
  25.     /// 枚举日志记录器  
  26.     el::Loggers::populateAllLoggerIds(&allLoggers);  
  27.     LOG(INFO) << allLoggers;  
  28.   
  29.     system("pause");  
  30.     return 0;  
  31. }  
#define ELPP_STL_LOGGING  #include "easylogging++.h"INITIALIZE_EASYLOGGINGPPint main(int argc, char** argv){	/// 使用一个不存在的日记记录器会输出一条错误信息	CLOG(INFO, "testlog");	/// 注册一个新的日志记录器	el::Logger* newLogger = el::Loggers::getLogger("testlog");	CLOG(INFO, "testlog") << "this is a new logger";	/// 枚举日志记录器,没有定义宏 ELPP_SYSLOG,不会枚举出系统日志记录器	std::vector
allLoggers; el::Loggers::populateAllLoggerIds(&allLoggers); LOG(INFO) << allLoggers; /// 注销日志记录器 el::Loggers::unregisterLogger("testlog"); /// 使用一个不存在的日记记录器会输出一条错误信息 CLOG(INFO, "testlog"); /// 枚举日志记录器 el::Loggers::populateAllLoggerIds(&allLoggers); LOG(INFO) << allLoggers; system("pause"); return 0;}

转载地址:http://yxhki.baihongyu.com/

你可能感兴趣的文章
SQL - SQL Server 一列或多列重复数据的查询,删除
查看>>
NET - .NET Core WebAPI + Vue + Axios 导出Excel / CSV
查看>>
NET - NET Core quartz.net 时间表达式----- Cron表达式详解
查看>>
NET - .NET Core 之 Abp Audit-Logging
查看>>
NET - .NET Core 之 Abp 整合 Quartz
查看>>
android 各式各样progress 进度条大全
查看>>
开发Google眼镜的app
查看>>
Android base-adapter-helper 源码分析与扩展
查看>>
Android 4.4从图库选择图片,获取图片路径并裁剪
查看>>
Android Fragment 你应该知道的一切
查看>>
使用AudioManager调节播放器音量的开发实例
查看>>
安卓开发者必备的42个链接
查看>>
Eclipse下Ant自动打包,混淆和签名
查看>>
linux环境下编译不成功
查看>>
Android WebView Long Press长按保存图片到手机
查看>>
BaseAnimation是基于开源的APP,致力于收集各种动画效果(最新版本1.3)
查看>>
TextView显示html图片点击图片放大等操作
查看>>
【Android】自定义控件让TextView的drawableLeft与文本一起居中显示
查看>>
Android Fragment getActivity返回null解决
查看>>
Android(视频、图片)加载和缓存类库Glide
查看>>