easylogging++是一个非常轻量级并且非常高效的一个日志库,支持文件配置,支持线程安全,并且其自定义格式非常的方便,最关键的是,其所有代码都集中在一个.h头文件之中,完全不需要引用第三方库,接入时非常的方便。在其github首页上给出了最简单的接入例子:

#include "easylogging++.h"

INITIALIZE_EASYLOGGINGPP

int main(int argc, char* argv[]) {
LOG(INFO) << "My first info log using default logger";
return ;
}

只需要引用一下头文件,并且调用下INITIALIZE_EASYLOGGINGPP宏进行初始化,INITIALIZE_EASYLOGGINGPP紧随着引用头文件之后的位置即可(不能放在头文件中哦),如果不调用这个宏,那么会报出以下错误:

$ g++ test.cpp -o main -std=c++
/tmp/ccPBiVzm.o: In function `el::base::debug::crashReason(int)':
test.cpp:(.text+0x1ed): undefined reference to `el::base::elStorage'
/tmp/ccPBiVzm.o: In function `el::base::LogFormat::updateFormatSpec()':
test.cpp:(.text._ZN2el4base9LogFormat16updateFormatSpecEv[_ZN2el4base9LogFormat16updateFormatSpecEv]+0xb43): undefined reference to `_ZN2el4base5utils13s_currentUserB5cxx11E'
test.cpp:(.text._ZN2el4base9LogFormat16updateFormatSpecEv[_ZN2el4base9LogFormat16updateFormatSpecEv]+0xb85): undefined reference to `_ZN2el4base5utils13s_currentUserB5cxx11E'
test.cpp:(.text._ZN2el4base9LogFormat16updateFormatSpecEv[_ZN2el4base9LogFormat16updateFormatSpecEv]+0xc0d): undefined reference to `_ZN2el4base5utils13s_currentHostB5cxx11E'
/tmp/ccPBiVzm.o: In function `el::base::LogDispatcher::dispatch()':
test.cpp:(.text._ZN2el4base13LogDispatcher8dispatchEv[_ZN2el4base13LogDispatcher8dispatchEv]+0x55): undefined reference to `el::base::elStorage'
test.cpp:(.text._ZN2el4base13LogDispatcher8dispatchEv[_ZN2el4base13LogDispatcher8dispatchEv]+0x94): undefined reference to `el::base::elStorage'
test.cpp:(.text._ZN2el4base13LogDispatcher8dispatchEv[_ZN2el4base13LogDispatcher8dispatchEv]+0xaf): undefined reference to `el::base::elStorage'
test.cpp:(.text._ZN2el4base13LogDispatcher8dispatchEv[_ZN2el4base13LogDispatcher8dispatchEv]+0xfe): undefined reference to `el::base::elStorage'
/tmp/ccPBiVzm.o: In function `el::base::MessageBuilder::initialize(el::Logger*)':
test.cpp:(.text._ZN2el4base14MessageBuilder10initializeEPNS_6LoggerE[_ZN2el4base14MessageBuilder10initializeEPNS_6LoggerE]+0x1c): undefined reference to `el::base::elStorage'
/tmp/ccPBiVzm.o:test.cpp:(.text._ZN2el4base14MessageBuilderlsEm[_ZN2el4base14MessageBuilderlsEm]+0x33): more undefined references to `el::base::elStorage' follow
collect2: error: ld returned exit status

我当前使用的easylogger++是v9.80版本,这个版本是需要c++11的支持的。否则无法编译通过。

编译通过之后,运行程序:

$ ./main
-- ::, INFO [default] My first info log using default logger
$ ls
easylogging++.h logs main test.cpp
$ cd logs/
$ ls
myeasylog.log

运行程序之后,发现当前文件夹下多了一个文件夹 logs,进入文件夹logs之后,发现日志内容输入到了myeasylog.log内。

如果想自定义日志文件名字和日志格式,就需要配置自己的配置文件,log.conf:

* GLOBAL:
FORMAT = "[%level | %datetime] | %msg"
ENABLED = true
TO_FILE = true
TO_STANDARD_OUTPUT = false
PERFORMANCE_TRACKING = false
MAX_LOG_FILE_SIZE = ## Throw log files away after 2MB / 200MB / 1GB
* INFO:
FILENAME = "log/info_%datetime{%Y%M%d%H}.log"
* DEBUG:
FILENAME = "log/debug_%datetime{%Y%M%d%H}.log"
* WARNING:
FILENAME = "log/warn_%datetime{%Y%M%d%H}.log"
* TRACE: * VERBOSE:
FORMAT = "%level-%vlevel | %datetime{%d/%M/%y} | %msg"
* ERROR:
FILENAME = "log/error_%datetime{%Y%M%d%H}.log"
TO_STANDARD_OUTPUT = true
* FATAL:
FILENAME = "log/fatal_%datetime{%Y%M%d%H}.log"
TO_STANDARD_OUTPUT = true

配置项都非常的简单明了,GLOBAL是全局配置,然后下面是各级配置,各级日志配置项若为空,就选用的全局日志的配置项。要让自己的配置生效,需要在代码中新增一些逻辑:

#include "easylogging++.h"

INITIALIZE_EASYLOGGINGPP

void init()
{
el::Configurations conf("log.conf");
el::Loggers::reconfigureAllLoggers(conf);
} int main()
{
init();
LOG(INFO) << "My first info log using default logger";
return ;
}

接着加上一个编译宏ELPP_NO_DEFAULT_LOG_FILE进行编译,否则无法生成自定义的日志文件:

$ g++ test.cpp -o main -std=c++ -DELPP_NO_DEFAULT_LOG_FILE
$ ./main
$ ls
easylogging++.h log log.conf logs main test.cpp
$ ls log
debug_2018060800.log error_2018060800.log fatal_2018060800.log info_2018060800.log warn_2018060800.log

可以看到,运行新的代码之后,目录下多了一个文件夹log,log文件下面就是我们自定义的日志文件了。这个效果是不是非常的棒棒呢?

另外easylogging++还支持线程安全,只需要编译的时候加上支持线程安全的编译宏——ELPP_THREAD_SAFE进行编译即可。其内部是通过mutex互斥锁的方式,实现的线程安全。这样在多线程环境下,也可以安全的使用easylogging++进行日志记录,确实非常的给力呢。

easylogging++学习记录(一):接入的更多相关文章

  1. easylogging++学习记录(二):流式日志

    easylogging++日志库流式日志的写入,依赖于el::base::Writer类的析构,以debug日志为例:具体代码如下: #define LOG(LEVEL) CLOG(LEVEL, EL ...

  2. Android开发技术周报176学习记录

    Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...

  3. EasyLogging++学习笔记(1)—— 简要介绍

    对于有开发经验的程序员来说,记录程序执行日志是一件必不可少的事情.通过查看和分析日志信息,不仅可以有效地帮助我们调试程序,而且当程序正式发布运行之后,更是可以帮助我们快速.准确地定位问题.在现在这个开 ...

  4. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  5. Java 静态内部类与非静态内部类 学习记录.

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

  6. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  7. UWP学习记录12-应用到应用的通信

    UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...

  8. UWP学习记录11-设计和UI

    UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...

  9. UWP学习记录10-设计和UI之控件和模式7

    UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...

随机推荐

  1. Flask 的 数据库连接 与 DBUtils 数据库连接池

    Flask 的 数据库连接 与 DBUtils 数据库连接池 本地线程:thread_local 为每个线程创建存储数据的空间,用于线程之间的数据隔离 否则多个线程同时访问,会使得数据混乱 1 Fla ...

  2. 【SQL查询】合并多个数据集_union

    SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每 ...

  3. SpringMVC札集(01)——SpringMVC入门完整详细示例(上)

    自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...

  4. svn: E220001: 遇到不可读的路径;拒绝访问。

    在客户端试图 svn merge 总是报svn: E220001: 遇到不可读的路径:拒绝访问.这个错误 提示 : SVN 遇到不可读的路径:拒绝访问. 英文是: Unreadable path en ...

  5. Helix Server 支持的文件格式

    比如,对于WMV格式的文件,访问路径可以是:mms://192.168.1.1/mov/music.wmv 对于rm格式的文件rtsp://192.168.1.1/mov/123.rm 但,比如对于格 ...

  6. 第2章 开始Flex

    * Flex开发中可用两种语言 1.MXML 2.ActionScript * Flex中使用两个组件集 1.MX (mx.*) 早期的Flex版本用到的组件集 2.Spark (spark.*) F ...

  7. c++使用http协议上传文件到七牛云服务器

    使用c++ http协议上传文件到七牛服务器时,比较搞的一点就是header的设置: "Content-Type:multipart/form-data;boundary=xxx" ...

  8. 【如何入门ACM】

    第一阶段:先刷水题,水题,就是几乎不牵扯算法.需要自己想方法解决.这样的题,一是锻炼逻辑和思维的严谨,二是锻炼代码能力.一般做到60-200题左右. 第二阶段:渐渐的学一些简单的算法,或者专题训练,或 ...

  9. hive外表parquet文件

    外表关联parquet文件 1. 为什么关联了一次数据文件就不能二次被使用: 2. 为什么删除了employee,select还是可以而且有数据,1,2可能是一个问题   外表drop只是metada ...

  10. eclipse 中xml文件的字体改不了

    XML Editor的改不了. 修改colors & fonts里的eclipse中打开window->prefece->generation-basic 下 Text Edito ...