參考博文 google-glog安裝使用 Google-glog 日誌庫使用手記 Google glog 使用 glog功能介紹html
Google glog是Google開發的C++庫,提供了C++風格的流操做與宏,實現程序日誌記錄。git
下載、安裝及環境配置
-
Google glog目前託管在GitHub,目前最新的穩定版本爲V0.35版,須要注意的是,直接用Git下載的話,會直接選master版本,V0.35版只可以直接下載ZIP文件。github
-
下載完成後解壓,運行根目錄下的google-glog.sln,使用VS編譯,注意選擇Debug和Release,以及Win32和X64(這裏選擇X64,Debug)。 編譯完成後,根目錄下會生成一個名爲X64的文件夾,其下有一個Debug文件夾,該文件夾下有glog的動態連接庫libglog.dll,libglog.lib文件,靜態連接庫libglog_static.lib。windows
-
在Qt下新建一個控制檯程序Glog_Test,將glog根目錄下的src/windows/glog文件夾(glog頭文件目錄)複製到Glog_Test的目錄下,將動態連接庫文件libglob.lib複製到glog文件夾內,將libglob.lib做爲外部第三方動態連接庫添加至Glog_Test,同時,將libglog.dll複製到Glog_Test的編譯輸出目錄。緩存
-
在main.cpp中包含glog的頭文件
#include "glog/logging.h"
cookie
Demo
#include <QCoreApplication> #include "glog/logging.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); google::InitGoogleLogging(argv[0]); LOG(INFO) <<"GLOG INFO TEST!"; google::ShutdownGoogleLogging(); return a.exec(); }
輸出爲 I1019 17:23:06.249490 21820 QGlog.cpp:36] GLOG INFO TEST!
函數
google::InitGoogleLogging(argv[0]); //使用glog以前必須先初始化庫,僅需執行一次,括號內爲程序名 google::ShutdownGoogleLogging(); //當要結束glog時必須關閉庫,不然會內存溢出
Glog嚴重性分級
Glog日誌分爲四個級別,枚舉以下:測試
enum SeverityLevel { google::INFO = 0, google::WARNING = 1, google::ERROR = 2, google::FATAL = 3, };
FATAL等級的日誌會在記錄之後終止程序運行,要謹慎使用。google
日誌輸出宏
LOG(INFO)<<"output info log" LOG(WARNING)<<"output warning log" LOG(ERROR)<<"out error log" LOG(FATAL)<<"out fatal log"
上述四個宏,分別記錄四種不一樣等級的日誌。url
參數設置
Glog經過命令行的方式對運行參數進行設置,其前綴均爲FLAGS_,下面列出一些較爲經常使用的,給出的都是默認值:
FLAGS_logtostderr = false; //是否將日誌輸出到stderr,而非文件 FLAGS_alsologtostderr = false; //日誌記錄到文件的同時輸出到stderr FLAGS_colourlogtostderr = flase; //是否將彩色日誌輸出到stderr FLAGS_drop_log_memory = true; //日誌寫到文件的時候刪除其在內存中的buf FLAGS_log_prefix = true; //每行log加前綴,其格式爲Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg FLAGS_minloglevel = google::INFO; //日誌最低記錄等級 FLAGS_logbuflevel = google::INFO; //緩存日誌的最低等級 , -1表示不緩存,0表示只緩存google::INFO FLAGS_logbufsecs = 30; //日誌最多緩存的秒數,0表示實時輸出 FLAGS_log_dir = ""; //設置日誌文件輸出目錄 FLAGS_max_log_size = 1800; //最大日誌大小(MB), 若是設置爲0將默認爲1 FLAGS_stop_logging_if_full_disk = false; //磁盤滿中止記錄日誌
Glog一樣提供了一些函數進行參數設置,經常使用的有:
google::SetStderrLogging(google::INFO); //設置級別高於 google::INFO 的日誌同時輸出到屏幕 google::SetLogDestination(google::INFO,"./logfiles/INFO/INFO_"); //設置 google::INFO級別的日誌存儲路徑和文件名前綴,一樣能夠對WARNING,ERROR,FATAL級別進行設置 google::SetLogFilenameExtension("Qt_"); //設置文件名擴展
###有條件的記錄日誌
LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies"; //只有當num_cookies > 10條件成立時,「Got lots of cookies」日誌信息才被記錄。 LOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie"; //每隔10次記錄一第二天志信息(第一、十一、21……次被執行的時候,記錄日誌信息)。 LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " <<google::COUNTER<< "th big cookie"; //size>1024的條件連續成立10次的時候記錄日誌信息。 LOG_FIRST_N(INFO, 20) << "Got the " <<google::COUNTER<< "th cookie"; //當該語句只在首次執行了20次之後記錄日誌信息。 google::COUNTER表示該語句執行的次數。
###本身作的封裝及測試 QGlog.h
#ifndef QGLOG_H #define QGLOG_H #include "glog/logging.h" #include <QObject> typedef int QGLogSeverityLevel; const int QINFO = 0, QWARNING = 1, QERROR = 2, QFATAL = 3; //enum QGLogSeverityLevel //{ // QINFO = 0, // QWARNING = 1, // QERROR = 2, // QFATAL = 3, //}; class QGlog:public QObject { Q_OBJECT public: QGlog(char* name); ~QGlog(); void WriteToLog(QGLogSeverityLevel level, QString info); private: }; #endif // QGLOG_H
QGlog.cpp
#include "QGlog.h" #include <QDir> QGlog::QGlog(char *name) { QDir dir; if(!dir.exists("./logfiles/INFO")) dir.mkpath("./logfiles/INFO"); if(!dir.exists("./logfiles/WARNING")) dir.mkpath("./logfiles/WARNING"); if(!dir.exists("./logfiles/ERROR")) dir.mkpath("./logfiles/ERROR"); google::InitGoogleLogging(name); google::SetStderrLogging(google::INFO); //設置級別高於 google::INFO 的日誌同時輸出到屏幕 google::SetLogDestination(google::INFO,"./logfiles/INFO/INFO_"); //設置 google::INFO 級別的日誌存儲路徑和文件名前綴 google::SetLogDestination(google::WARNING,"./logfiles/WARNING/WARNING_"); //設置 google::WARNING 級別的日誌存儲路徑和文件名前綴 google::SetLogDestination(google::ERROR,"./logfiles/ERROR/ERROR_"); //設置 google::ERROR 級別的日誌存儲路徑和文件名前綴 google::SetLogFilenameExtension("Qt_"); //設置文件名擴展 FLAGS_colorlogtostderr = true; //設置輸出到屏幕的日誌顯示相應顏色 FLAGS_logbufsecs = 0; //緩衝日誌輸出,默認爲30秒,此處改成當即輸出 FLAGS_max_log_size = 100; //最大日誌大小爲 100MB FLAGS_stop_logging_if_full_disk = true; //當磁盤被寫滿時,中止日誌輸出 } QGlog::~QGlog() { google::ShutdownGoogleLogging(); } void QGlog::WriteToLog(QGLogSeverityLevel level, QString info) { QByteArray ba = info.toUpper().toLatin1(); char* ch = ba.data(); if(level == QINFO) LOG(INFO)<<ch; else if(level == QWARNING) LOG(WARNING)<<ch; else if(level == QERROR) LOG(ERROR)<<ch; else if(level == QFATAL) LOG(FATAL)<<ch; }
main.cpp
#include <QCoreApplication> #include "QGlog.h" static QGlog testlog("log"); int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); testlog.WriteToLog(QINFO,"QGlog INFO test!"); testlog.WriteToLog(QWARNING,"QGlog WARNING test!"); testlog.WriteToLog(QERROR,"QGlog ERROR test!"); return a.exec(); }