第一次使用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