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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章