zoukankan      html  css  js  c++  java
  • Easylogging

    https://blog.csdn.net/woshichenweixian/article/details/77018452

    一.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:
    FORMAT = %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

     
     
     
     
  • 相关阅读:
    常用排序算法(快速排序,冒泡排序,最大公约数,Fibonacci )【原创】
    Sql之left_join、right_join、inner_join的解释
    Effective C# 学习笔记(九) 在你的API中避免使用类型转换运算
    Effective C# 学习笔记(十) 用可选参数尽量减少方法重载
    NHibernate学习笔记(5)—正向与反向生成
    NHibernate学习(7)—对于实现机理的猜测
    Effective C# 学习笔记(一) 用属性替代公有变量
    Effective C# 学习笔记(十一)尽量缩减函数体的大小,提高运行效率
    我的学习之路
    NHibernate学习笔记(4)—使用存储过程
  • 原文地址:https://www.cnblogs.com/liujx2019/p/13859591.html
Copyright © 2011-2022 走看看