easylogging++学习记录(一):接入
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++学习记录(一):接入的更多相关文章
- easylogging++学习记录(二):流式日志
easylogging++日志库流式日志的写入,依赖于el::base::Writer类的析构,以debug日志为例:具体代码如下: #define LOG(LEVEL) CLOG(LEVEL, EL ...
- Android开发技术周报176学习记录
Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...
- EasyLogging++学习笔记(1)—— 简要介绍
对于有开发经验的程序员来说,记录程序执行日志是一件必不可少的事情.通过查看和分析日志信息,不仅可以有效地帮助我们调试程序,而且当程序正式发布运行之后,更是可以帮助我们快速.准确地定位问题.在现在这个开 ...
- Quartz 学习记录1
原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...
- Java 静态内部类与非静态内部类 学习记录.
目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...
- Apache Shiro 学习记录4
今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...
- UWP学习记录12-应用到应用的通信
UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...
- UWP学习记录11-设计和UI
UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...
- UWP学习记录10-设计和UI之控件和模式7
UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...
随机推荐
- python学习网址
http://kuanghy.github.io/categories/#Python
- CodeIgniter (CI)框架中的数据库查询汇总
引言: 前两天业务涉及到一个拉取答题排行榜的需求,数据库里数据是这样的: 同一个人可能提交过多次成绩,所以同一个人可能会有多次记录: 同一个人提交的多次成绩中可能有至少两次成绩是一样的. 于是,查询的 ...
- Illumina Fastq Q-score
Illumina Nextseq500 Miseq HiseqXten 测序仪 Q-score均采用下面的编码格式,仅作简要介绍. Q-score Q-score 在fastq中每个序列的第4行,代表 ...
- [置顶]
Android逆向从未如此简单
哈,又标题党了..不过我一定竭尽所能,写一篇最亲民的入门文章. 本文仅供学习交流之用,切勿用于非法用途,读者若运用所学知识,进行非法任何商业目的或者非法牟利,一切责任由操作者自行承担,与本人无关.希望 ...
- Ubuntu下安装为知笔记
之前在Windows下用的是有道云笔记,但是后来开始习惯使用Linux开发,有道云官方并没有提供Ubuntu的版本,所以权衡之下,选择了为知笔记,安装步骤: sudo add-apt-reposito ...
- 为什么要使用ORM技术?和 JDBC 有何不一样?
为什么要使用ORM技术?和 JDBC 有何不一样? 1.繁琐的代码问题: 用JDBC的API编程访问数据库,代码量较大,特别是访问字段较多的表的时候,代码显得繁琐.累赘,容 ...
- Maven打包同一个jar有不同的:版本+时间戳(解决思路)
在我们的开发过程中,目前流行的版本控制工具maven,在项目开发阶段,大家都是通过发布SNAPSHOT快照版进行相互模块之间的依赖开发, 这个时候就会有一个问题,要是一天构建多次的快照版,会发现在项目 ...
- 【ecmall】解决无法上传店铺logo和banner照片问题 (转)
问题描述:在ecmall个人用户登录,点击用户中心-店铺设置-更换店标,上传一个jpg图像(图像符合规范)后,不能预览,而且在页面底部点击提交后没有上传成功.banner店铺条幅也是一样的情况,还有下 ...
- 转JMeter 利用Jmeter批量数据库插入数据
1. 启动Jmeter 2. 添加 DBC Connection Configuration 右键线程组->添加->配置元件->JDBC Connection Configu ...
- Oracle存储过程使用总结
1.使用Oracle存储过程查询结果集: 网上写的都是他妈的扯淡!其实一句话就行了,你只要返回一个游标就OK了.具体代码如下: CREATE OR REPLACE PROCEDURE PR_ORDER ...