Easylogging介绍和简单使用

一.Easylogging简介
Easyloggingpp是一个C++开源log库,其在github的地址:https://github.com/muflihun/easyloggingpp
Easyloggingpp最大的特点是只需一个头文件,且所有功能都是内部实现,无需依靠其他第三方库,所以使用起来非常方便。同时,该库又有很丰富的特性:
(0)跨平台:windows,linux,Android等平台
(1)轻量级
(2)高性能
(3)线程和类型安全性
(4)高可配置性:可配置log输出目的设备,自定义log格式,log等级调控等。
(5)性能跟踪
(6)支持STL  log,第三方库(QT,boost等)log
(7)可扩展:支持自定义类log输出

二.Easylogging使用
在写这篇文章时(2017-08-10),Easyloggingpp的最新版本为v9.95.0。在V8.91之后的版本都会用到C++11的一些特性,所以,如果你的项目所使用的编译器不能完全支持C++11的特性,可考虑使用V8.91版。V8.91是目前很稳定的支持C++98和C++03的版本。
使用Easyloggingpp非常简单,只需两个步骤:
(1)把easylogging++.h 包含进你的项目中;
(2)用一个宏进行初始化:INITIALIZE_EASYLOGGINGPP
#include "easylogging++.h"
_INITIALIZE_EASYLOGGINGPP

int _tmain(int argc, _TCHAR* argv[])
{
	LOG(INFO) << "My First Easylog!" ;
	return 0 ;
}

Easyloggingpp的使用就是怎么简单。

三.Easylogging配置
默认情况下,在windows中,logs将会输出到当前工作目录下的logs/myeasylog.log下,可通过配置改变这个路径。在开始配置之前,需要了解下Easylogging中的等级概念,其共有下面的一些等级:
ALL     INFO      DEBUG       WARNING      ERROR       FATAL  等等,其中ALL是一个概念上的等级,不能用于实际的LOG输出。当配置了ALL等级了之后,其他没有配置的等级都按照ALL等级的配置。

比较常用的配置项如下:
(1)是否输出log (ENABLED)
(2)log是输出到标准输出还是输出到log文件 (TO_FILE , TO_STANDARD_OUTPUT)
(3)log文件名和路径名 (FILENAME)
(4)log格式 (FORMAT)
(5)log文件达到多大的时候清除掉log,重新开始 (ROLL_OUT_SIZE)
括号内的为每一个配置项的关键字


配置信息的格式如下:
// 为注释符号
*LEVEL:
CONFIGURATION_NAME = CONFIGURATION_VALUE

一个简单的配置项例子如下:
* ALL: // We need to start level with star '*' and end with colon ':'
           FORMAT   ="%level: %log"  // Quotes are not necessary but to make it more readable we wrap quotes around.
           FILENAME = "logs/testLog.log"
           ENABLED =true
           TO_FILE =true
           TO_STANDARD_OUTPUT =false
           MILLISECONDS_WIDTH =3
           PERFORMANCE_TRACKING =false
           ROLL_OUT_SIZE           =  2097152 // Throw log files away after 2MB

           // Following configuration only defines FORMAT for INFO, rest of the configurations are used from ALL configurations above
          * INFO:
          FORMAT ="%datetime %level %log"

上面的配置配置了ALL等级和INFO等级,则除了INFO等级的FORMAT配置项外,其中配置都用ALL等级里面的(包括INFO等级的其他配置项和其他等级的全部配置项)。

有三种不同的方式来导入配置信息:
(1)通过配置文件
假设我们把配置信息存放在myconfiguration_file文件中,则导入配置信息的代码如下:
easyloggingpp::Configurations confFromFile("myconfiguration_file");  // Load configuration from file
easyloggingpp::Loggers::reconfigureAllLoggers(confFromFile); // Re-configures all the loggers to current configuration file

(2)内联的配置,即直接用std::string传递配置信息:
easyloggingpp::Configurations c;
c.setToDefault();
c.parseFromText("*ALL:\nFORMAT = %level");

(3)直接通过easylogginggpp::Configurations 类来配置
前面的两种方式最终是通过Easylogging里面实现的一个类来处理配置信息的,我们也可以直接调用这个类的接口来配置:
_INITIALIZE_EASYLOGGINGPP
int main(int argc, const char** argv) {
    easyloggingpp::Configurations defaultConf;
    defaultConf.setToDefault();
          defaultConf.set(easyloggingpp::Level::Info, easyloggingpp::ConfigurationType::Format, "%datetime %level %log"); // Values are always std::string
          easyloggingpp::Loggers::reconfigureLogger("business", defaultConf); // Business logger uses default configurations
              BINFO << "Log using default file";    // Log message:  01/01/2013 00:00:00.551 INFO Log using default file
             // To set ALL configuraions you may use
             defaultConf.setAll(easyloggingpp::ConfigurationType::Format, "%datetime %level %log");
             easyloggingpp::Loggers::reconfigureLogger("business", defaultConf); // Business logger uses default configurations
         return 0;
            }

    Easylogging的配置能力还有很多可以深究下去的,例如配置log格式是,有很多标识符可以用,例如:
         %logger :调试器ID
             %thread:线程ID
          %level :log等级
          %datetime:等
         详细的信息可以参考Easylogging的README文件。

     四.Easylogging的调试器(Logger)
有四个默认的调试器:trival , business , security , performance 你也可以通过easylogginggpp::loggers::getlogger(identifier)来注册新的调试器。
有很多宏来帮助我们使用默认的调试器:
        ######Trivial Logger
       `LINFO`, `LDEBUG`, `LWARNING`, `LERROR`, `LFATAL`, `LQA`, `LTRACE`, `LVERBOSE`
例如:
       LINFO << "the trival's info level logs" ;

其他调试器的宏:
 ######Business Logger
         `BINFO`, `BDEBUG`, `BWARNING`, `BERROR`, `BFATAL`, `BQA`, `BTRACE`, `BVERBOSE`
         ######Security Logger
         `SINFO`, `SDEBUG`, `SWARNING`, `SERROR`, `SFATAL`, `SQA`, `STRACE`, `SVERBOSE`
          ######Performance Logger
         `PINFO`, `PDEBUG`, `PWARNING`, `PERROR`, `PFATAL`, `PQA`, `PTRACE`, `PVERBOSE`

五.其他一些有用的输出宏
  条件输出宏:
  LDEBUG_IF(condition) << log
        LINFO_IF(condition) << log
        LWARNING_IF(condition) << log等宏,当()里面的条件成立时才输出对应的log,例如:
        LINFO_IF(1 == 1) << "1 == 1 is true!" ;

间隔输出宏:
 LDEBUG_EVERY_N(n) << log
 LINFO_EVERY_N(n) << log
           LWARNING_EVERY_N(n) << log等宏,()里面的n表示该条log只有在没调用n次才会输出一次,
例如:
          for(int i = 0  ; i < 6 ; ++i)
          LINFO_EVERY_N(3) << "Every N Log" ;
          则只有第三次和第六次才会输出log

      六.扩展的类log输出
如果想输出自己的类,只需要重载<<操作符就可以了,例如下面的例子:
#include "easylogging++.h"
_INITIALIZE_EASYLOGGINGPP

class MyClass {
    public:
        MyClass(const std::string& name_) : name_(name_) {}


        std::string name(void) const {
            return name_;
        }
        void setName(const std::string& name_) {
            this->name_ = name_;
        }


        friend std::ostream& operator<<(std::ostream& stream_, const MyClass& myClass);
        private:
        std::string name_;
};

std::ostream& operator<<(std::ostream& stream_, const MyClass& myClass) {
        stream_ << "MyClass name is " << myClass.name();
        return stream_;
}


int main(void) {
    MyClass myClass("Awesome class");
    LINFO << myClass;

       return 0;
}

main函数中用可以LINFO像其他内置数据类型一样输出了myClass,则会输出log如下:
1     4:32:47.031 INFO  MyClass name is Awesome class

如果要输出STL的string,wstring等类和容器:vector,list,map,set等,则只需定义宏:_ELPP_STL_LOGGING
          如果要支持QT库的类输出,则需定义宏:_ELPP_QT_LOGGING



Easylogging是一个简单易用的日志库,它可以帮助开发人员在程序运行过程中记录并追踪各种日志信息。它提供了许多便捷的方法,使开发人员能够根据实际需要对日志进行配置,并将其输出到不同的地方,如控制台、文件等。 多线程是一种在同一个进程中同时执行多个任务的方法。多线程可以提高程序的并发性和效率,但也会带来一些问题。其中一个常见的问题是内存暴涨。 内存暴涨指的是程序在运行过程中占用的内存空间急剧增加。多线程程序中,每个线程都有自己的栈空间,用于存储局部变量等数据。当多个线程同时执行时,可能会导致大量的栈帧被同时创建和销毁,从而占用大量的内存空间。此外,多线程程序还可能存在共享数据的问题,需要使用一些同步机制来保证数据的正确性,这也会增加内存的开销。 为了解决多线程程序中的内存暴涨问题,可以采取一些措施。首先,可以对线程进行优化,尽量减少线程的创建和销毁次数,减少栈空间占用。其次,可以优化共享数据的访问方式,使用一些高效的同步机制,如读写锁、原子操作等,减少内存开销。此外,还可以使用一些内存管理工具来监测和调优程序的内存使用情况,及时发现和解决内存暴涨问题。 总结来说,Easylogging可以帮助我们方便地记录和追踪日志信息,多线程能够提高程序的并发性和效率,但同时也会带来内存暴涨的问题。为了解决内存暴涨,我们可以采取一些优化措施,减少线程的创建和销毁次数,优化共享数据的访问方式,并使用内存管理工具监测和调优程序的内存使用情况。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值