log4qt qt使用日誌系統

第一次使用log4qt日誌系統,之前沒有使用過log4j,log4cplus等,簡單的記錄下使用過程。

log4qt是Apache的log4j的qt移植版本,log4j是在java下面使用的一個超強大的日誌系統,只要引起一個包一句代碼就可以使用,做java開發的小夥伴應該都不陌生。
log4qt是一些大牛參考log4j整理的一套在C++上使用的日誌系統,使用參考log4j的使用,log4qt是開源的,使用的過程中我發現有多個版本源碼,且各不相等,實現也各不相同,有一些配置選項並沒有實現,需要自己修改源碼,比如說設置輸出等級,打印文件名、函數名、行號等信息。

在log4qt的基礎上,研究源碼,自己實現打印文件名、函數名、行號等信息,這個還是比較有用的,在出現bug的時候比較好定位。

首先log4qt是一個開源的源碼,可以在官網進行下載源碼:https://sourceforge.net/projects/log4qt/,爲了方便使用將其編譯成一個dll進行使用,在使用的工程裏面加載dll和相應的頭文件即可。

 一、在qt上創建一個dll工程,將log4qt源碼添加到工程裏面 include(log4qt/log4qt.pri)

 

二、創建一個繼承QObject的單列,關鍵步驟是在一個名字爲 LOG4QT_DECLARE_QCLASS_LOGGER的宏,這樣纔可以使用log4qt 否則不可使用 ,在構造函數裏面加載log4qt的配置文件log4qt.conf 如圖:

配置文件如下 log4qt.conf: 具體配置可以自己百度研究這裏就不多說了,參考log4j的配置方式(有些配置項在qt可能沒有實現)

log4j.rootLogger=INFO, rollingFile
log4j.additivity.org.apache=true
log4j.appender.rollingFile=Log4Qt::RollingFileAppender
log4j.appender.rollingFile.ImmediateFlush=true
log4j.appender.rollingFile.AppendFile=true
log4j.appender.rollingFile.File=C:/Users/Dione/AppData/Local/log4Test/log4qt.log
log4j.appender.rollingFile.MaxFileSize=4096KB
log4j.appender.rollingFile.MaxBackupIndex=50
log4j.appender.rollingFile.layout=Log4Qt::PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern=[%p] %d(%r) --> %m %n

 

最簡單使用如下:

    QBLog4Qt::instance()->debug("debug");
    QBLog4Qt::instance()->info("debug");
    QBLog4Qt::instance()->warn("debug");
    QBLog4Qt::instance()->error("debug");
    QBLog4Qt::instance()->fatal("debug");

三、在使用的過程中我發現 配置輸出日誌信息帶文件名、函數名、行號等信息無效,經過閱讀源碼發現,log4qt根本就可以實現對應的配置選項(至少我下載的版本是沒有實現的),參考qt debug類實現log4qt的文件名、函數名、行號信息輸出。

添加一個QBLog4Helper類,通過宏定義的方式實現 :

#define Log4Debug QBLog4Helper(__FILE__, __LINE__, Q_FUNC_INFO).debug
爲了實現跟debug的輸出格式一致,列如可以輸出多個參數,參數個1-n個 參數類型任意等,使用C++11的類模板動態參數:

QString TemplateParameter (){ return ""; }
    template <typename T, typename ... Args>
    QString TemplateParameter(T head, Args ... args) { return QString("%1 ").arg(head) + TemplateParameter(args...); }

    template <typename T, typename ... Args>
    void debug(T head, Args ... args){
        QString logmsg = QString("%1 ").arg(head) + TemplateParameter(args...);
        writelogToLocal(LGDebugMsg,logmsg);
    }

這樣實現後就可以這樣使用了:

    QString str = "String";
    char* p = "char*";
    int i = 1;
    double d= 1.1;
    char c = 'c';
    float f = 1.111;

    Log4Info(str);
    Log4Info(str,p);
    Log4Info(str,p,i);
    Log4Info(str,p,i,d);
    Log4Info(str,p,i,d,c);
    Log4Info(str,p,i,d,c,f);
    Log4Info(str,p,i,d,c,f,"漢字");
    Log4Info(str,p,i,d,c,f,"漢字","log4qt!");

    Log4qt<<"1"<<1<<1.1<<'c'<<"漢字"<<"log4qt!";

這樣使用是不是很爽呢。輸出保存的日誌結果如下:

[INFO] 2018-09-12 16:00:21.085(124) --> start used log4qt! 

[INFO] 2018-09-12 16:00:21.085(124) --> [file(..\log4Test\main.cpp) func(int qMain(int, char**)) line(16) pid(0x28028)] --> String  

[INFO] 2018-09-12 16:00:21.086(125) --> [file(..\log4Test\main.cpp) func(int qMain(int, char**)) line(17) pid(0x28028)] --> String char*  

[INFO] 2018-09-12 16:00:21.086(125) --> [file(..\log4Test\main.cpp) func(int qMain(int, char**)) line(18) pid(0x28028)] --> String char* 1  

[INFO] 2018-09-12 16:00:21.086(125) --> [file(..\log4Test\main.cpp) func(int qMain(int, char**)) line(19) pid(0x28028)] --> String char* 1 1.1  

[INFO] 2018-09-12 16:00:21.086(125) --> [file(..\log4Test\main.cpp) func(int qMain(int, char**)) line(20) pid(0x28028)] --> String char* 1 1.1 c  

[INFO] 2018-09-12 16:00:21.086(125) --> [file(..\log4Test\main.cpp) func(int qMain(int, char**)) line(21) pid(0x28028)] --> String char* 1 1.1 c 1.111  

[INFO] 2018-09-12 16:00:21.086(125) --> [file(..\log4Test\main.cpp) func(int qMain(int, char**)) line(22) pid(0x28028)] --> String char* 1 1.1 c 1.111 漢字  

[INFO] 2018-09-12 16:00:21.087(126) --> [file(..\log4Test\main.cpp) func(int qMain(int, char**)) line(23) pid(0x28028)] --> String char* 1 1.1 c 1.111 漢字 log4qt!  

[INFO] 2018-09-12 16:00:21.087(126) --> [file(..\log4Test\main.cpp) func(int qMain(int, char**)) line(25) pid(0x28028)] --> 1 

[INFO] 2018-09-12 16:00:21.087(126) --> [file(..\log4Test\main.cpp) func(int qMain(int, char**)) line(25) pid(0x28028)] --> 1 

[INFO] 2018-09-12 16:00:21.087(126) --> [file(..\log4Test\main.cpp) func(int qMain(int, char**)) line(25) pid(0x28028)] --> 1.1 

[INFO] 2018-09-12 16:00:21.087(126) --> [file(..\log4Test\main.cpp) func(int qMain(int, char**)) line(25) pid(0x28028)] --> c 

[INFO] 2018-09-12 16:00:21.087(126) --> [file(..\log4Test\main.cpp) func(int qMain(int, char**)) line(25) pid(0x28028)] --> 漢字 

[INFO] 2018-09-12 16:00:21.087(126) --> [file(..\log4Test\main.cpp) func(int qMain(int, char**)) line(25) pid(0x28028)] --> log4qt! 

[INFO] 2018-09-12 16:00:21.088(127) --> stop used log4qt! 

完整的工程下載地址(dll工程和測試工程):https://download.csdn.net/download/u012532263/10686200

僅供學習參數使用,謝謝! by Dione

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