对于有开发经验的程序员来说,记录程序执行日志是一件必不可少的事情。通过查看和分析日志信息,不仅可以有效地帮助我们调试程序,而且当程序正式发布运行之后,更是可以帮助我们快速、准确地定位问题。在现在这个开源的年代,并不需要我们自己去写一套日志库,开源的版本已经有很多了。然而遗憾的是,在目前开源的C++日志库中,并没有一个在使用份额上占绝对优势的,我自己之前用过log4cplus和glog,这两个库都比较成熟了,而且网上教程也很多,所以一直都很喜欢使用这两个日志库。
前段时间,在GitHub上我偶然看到了另外一个开源的C++日志库,当时还只是粗略地研究了一下,结果竟然让我爱不释手,它就是Easylogging++。和log4cplus和glog相比,Easylogging++最大的特点就是它只有一个头文件,并且无需任何外部依赖,我从来没有见过哪一个日志库可以做到如此轻量而且还能兼顾性能的。除此之外,Easylogging++使用起来非常简单,同时还支持文件配置,提供了强大的自定义日志格式的能力,还提供对第三方库,STL容器的支持。面对如此炫酷的开源日志,怎么能不去学习学习!!!
Easylogging++项目在GitHub的开源地址:https://github.com/easylogging/easyloggingpp
功能特征
- 高度可配置
- 速度非常快
- 线程和类型安全
- 跨平台
- 自定义日志模式
- 条件日志和偶然日志
- 性能跟踪
- 详细记录日志
- 中断处理
- 辅助CHECK宏
- STL 日志
- 第三方库日志(比如Qt, boost, wxWidgets)
- 可扩展性
- 支持Debug功能
- 系统日志记录
- perror风格日志
- C++流操作符风格日志
- C 语言printf风格日志
- ……
写这篇文章时,最新的 Easylogging++ 版本是V9.80,如果编译器不支持C++11的话,是无法编译的。对于Visual Studio系列来说,必须是VS2012或以上版本才行。如果还停留在VS2010、VS2008,VS2005的小伙伴,可以考虑使用EasyLogging++ V8.91版本。需要注意的是,不同的版本在使用方法和功能支持上都会有所差异。特别指出,本系列中所有的学习记录,只适用于 Easylogging++ 版本V9.80。另外,在本系列文章中出现的所有演示代码都是在 64Bit Windows 7 系统下使用 Visual Studio 2013 编译测试的。
快速使用
正如前面所说,Easylogging++使用起来非常简单,简单到什么地步呢?下面是GitHub上给出一个示例代码:
#include "easylogging++.h"
INITIALIZE_EASYLOGGINGPP
int main(int argv, char* argc[]) {
LOG(INFO) << "My first info log using default logger";
return 0;
}
示例代码只有短短几行,每行代码的作用也一目了然:
- 包含easylogging++.h头文件
- 使用宏 INITIALIZE_EASYLOGGINGPP 初始化
- 使用宏 LOG(INFO) 开始日志记录
#include "easylogging++.h"
INITIALIZE_EASYLOGGINGPP
int main(int argc, char** argv)
{
el::Configurations conf("my_log.conf");
el::Loggers::reconfigureAllLoggers(conf);
LOG(TRACE) << "***** trace log *****";
LOG(DEBUG) << "***** debug log *****";
LOG(ERROR) << "***** error log *****";
LOG(WARNING) << "***** warning log *****";
LOG(INFO) << "***** info log *****";
system("pause");
return 0;
}
* GLOBAL:
ENABLED = true
TO_FILE = true
TO_STANDARD_OUTPUT = true
FORMAT = "[%level | %datetime] | %msg"
FILENAME = "log\\log_%datetime{%Y%M%d}.log"
MILLISECONDS_WIDTH = 3
PERFORMANCE_TRACKING = false
MAX_LOG_FILE_SIZE = 1048576
LOG_FLUSH_THRESHOLD = 0
* TRACE:
FILENAME = "log\\trace_log_%datetime{%Y%M%d}.log"
* DEBUG:
FILENAME = "log\\debug_log_%datetime{%Y%M%d}.log"
* FATAL:
ENABLED = false
* ERROR:
FILENAME = "log\\error_log_%datetime{%Y%M%d}.log"
* WARNING:
FILENAME = "log\\warning_log_%datetime{%Y%M%d}.log"
* INFO:
FILENAME = "log\\info_log_%datetime{%Y%M%d}.log"
* VERBOSE:
ENABLED = false