所有的日志都是由日志记录器完成的,日志记录器使用唯一的ID(大小写敏感)来标识。在Easylogging++中默认了三个现有的日志记录器:
·默认日志记录器,其ID为:default
·性能日志记录器,其ID为:performance
·系统日志记录器,其ID为:syslog,需要定义宏ELPP_SYSLOG,否则不存在
注册日志记录器
el::Loggers::getLogger()函数
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()注销某一个日志记录器。下面是这个函数的源码:
static inline bool unregisterLogger(const std::string& identity) {
base::threading::ScopedLock scopedLock(ELPP->lock());
return ELPP->registeredLoggers()->remove(identity);
}
在Easylogging++ V9.80版本中,这个函数有个错误,最终会导致程序崩溃。原因很简单,就是有个指针对象释放之后仍被使用,下面是出错的源码:
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> &)枚举日志库中所有的日志记录器。下面的代码演示了注册、注销、枚举日志记录器等功能:
#define ELPP_STL_LOGGING
#include "easylogging++.h"
INITIALIZE_EASYLOGGINGPP
int 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<std::string> 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;
}
参考:
https://www.yuque.com/docs/share/2001b556-7af7-4bee-9596-c1cb73979e91