Easylogging++是通过源码文件来集成的跨平台日志库,使用起来非常方便,优点是使用方便,速度快,线程安全,可配置。EasyLogging++日志库只有两个文件,一个头文件一个代码文件拷贝到项目工程中就可以使用。
Easylogging++的项目地址如下所示:
https://github.com/amrayn/easyloggingpp
项目库只有两个文件分别为easylogging++.h和easylogging++.cc
将库文件拷贝到项目中之后我们就可以使用easylogging++库了,在使用库之前我们需要对库进行配置,配置方式支持代码配置和配置文件配置下面分别介绍两种配置方法的使用。
#include "easylogging++.h"
//初始化日志库
INITIALIZE_EASYLOGGINGPP
//通过定义宏启动线程安全配置
#define ELPP_THREAD_SAFE
static void ConfigEasyLogging()
{
el::Configurations conf;
// 启用日志
conf.setGlobally(el::ConfigurationType::Enabled, "true");
//设置日志文件目录以及文件名
conf.setGlobally(el::ConfigurationType::Filename, "log\\log_%datetime{%Y%M%d %H%m%s}.log");
//设置日志文件最大文件大小
conf.setGlobally(el::ConfigurationType::MaxLogFileSize, "1920000");
//是否写入文件
conf.setGlobally(el::ConfigurationType::ToFile, "true");
//是否输出控制台
conf.setGlobally(el::ConfigurationType::ToStandardOutput, "true");
//设置日志输出格式
conf.setGlobally(el::ConfigurationType::Format, "[%datetime] [%loc] [%level] : %msg");
//设置日志文件写入周期,每10条刷新到输出流中
conf.setGlobally(el::ConfigurationType::LogFlushThreshold, "10");
//加载配置
el::Loggers::reconfigureAllLoggers(conf);
}
日志格式支持如下的配置:
%logger 日志ID
%thread 线程ID
%thread_name 线程名称
%level 日志级别
%levshort 日志级别 缩写显示
%vlevel 详细日志级别
%datetime 日志时间
%user 当前用户
%host 当前的主机名称
%file* 输出日志的源码文件的名称
%fbase* 不包含源码文件扩展名的文件名
%line* 代码的行号
%func* 函数名称
%loc* 文件名称和行号
%msg 日志消息
% 转义特殊字符
时间格式
%d 日格式(01~31)
%a 周几英文简写(Mon, Tue, Wed, Thu, Fri, Sat, Sun)
%A 周几英文全拼(Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
%M 月份(01~12)
%b 月份简拼(Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)
%B 月份全拼(January, February, March, April, May, June, July, August, September, October, November, December)
%y 两位的年份(13, 14 etc)
%Y 四位的年份(2013, 2014 etc)
%h 小时 (12-hour format)
%H 小时 (24-hour format)
%m 分钟 (zero-padded)
%s 秒钟 (zero-padded)
%F AM/PM 设置
除了使用代码来进行配置之外,我们还可以通过配置文件来进行配置,配置文件的格式如下所示:
config.conf
* GLOBAL:
FORMAT = "[%datetime] | [%level] | %msg"
FILENAME = "log/log_%datetime{%Y%M%d}.log"
ENABLED = true
TO_FILE = true
TO_STANDARD_OUTPUT = false
SUBSECOND_PRECISION = 3
PERFORMANCE_TRACKING = false
MAX_LOG_FILE_SIZE = 209715200 ## Throw log files away after 2097152 2MB / 209715200 200MB / 4398046511104 1GB
LOG_FLUSH_THRESHOLD = 0
* INFO:
FILENAME = "log/info_%datetime{%Y%M%d}.log"
* VERBOSE:
FORMAT = "[%datetime] | [%level-%vlevel] | %msg"
* WARNING:
FILENAME = "log/warn_%datetime{%Y%M%d}.log"
TO_STANDARD_OUTPUT = true
* ERROR:
FILENAME = "log/error_%datetime{%Y%M%d}.log"
TO_STANDARD_OUTPUT = true
* FATAL:
FILENAME = "log/fatal_%datetime{%Y%M%d}.log"
TO_STANDARD_OUTPUT = true
* DEBUG:
FILENAME = "log/debug_%datetime{%Y%M%d}.log"
## ENABLED = false
* TRACE:
## FILENAME = "log/trace_%datetime{%Y%M%d}.log"
FORMAT = "[%datetime] | [%level] %loc %func | %msg"
## ENABLED = false
配置文件放在对应的目录下,在使用的时候通过加载生效,加载方式如下
#include "easylogging++.h"
INITIALIZE_EASYLOGGINGPP
//通过定义宏启动线程安全配置
#define ELPP_THREAD_SAFE
int main(int argc, char *argv[])
{
//加载配置文件并生效
el::Configurations conf("config.conf");
el::Loggers::reconfigureAllLoggers(conf);
//致命错误不关闭程序
el::Loggers::addFlag(el::LoggingFlag::DisableApplicationAbortOnFatalLog);
}
加载完毕日志库之后,我们就可以使用对应的日志库了,日志库的使用方法示例如下所示:
#include "easylogging++.h"
INITIALIZE_EASYLOGGINGPP
#define ELPP_THREAD_SAFE
int main(int argc, char *argv[])
{
//配置日志库
el::Configurations conf("configlog.conf");
el::Loggers::reconfigureAllLoggers(conf);
el::Loggers::addFlag(el::LoggingFlag::DisableApplicationAbortOnFatalLog);
//设置日志输出级别
el::Loggers::setLoggingLevel(el::Level::Trace);
//设置详细级别就是通过数字大小来区分日志级别
el::Loggers::setVerboseLevel(9);
int verboseLevel = el::Loggers::verboseLevel();
LOG(INFO) << "Verbose Level = " << verboseLevel;
LOG(INFO) << "this is info log";
LOG(WARNING) << "this is waring log";
LOG(ERROR) << "this is error log";
LOG(FATAL) << "this is fatal log";
LOG(DEBUG) << "this is debug log";
LOG(TRACE) << "this is trace log";
VLOG(0) << "this is level 0 log";
VLOG(1) << "this is level 1 log";
return a.exec();
}