參考博文
google-glog安裝使用
Google-glog 日志庫使用手記
Google glog 使用
glog功能介紹
Google glog是Google開發的C++庫,提供了C++風格的流操作與宏,實現程序日志記錄。
下載、安裝及環境配置
-
Google glog目前托管在GitHub,目前最新的穩定版本為V0.35版,需要注意的是,直接用Git下載的話,會直接選master版本,V0.35版只能夠直接下載ZIP文件。
-
下載完成后解壓,運行根目錄下的google-glog.sln,使用VS編譯,注意選擇Debug和Release,以及Win32和X64(這里選擇X64,Debug)。
編譯完成后,根目錄下會生成一個名為X64的文件夾,其下有一個Debug文件夾,該文件夾下有glog的動態鏈接庫libglog.dll,libglog.lib文件,靜態鏈接庫libglog_static.lib。 -
在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"
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等級的日志會在記錄以后終止程序運行,要謹慎使用。
日志輸出宏
LOG(INFO)<<"output info log"
LOG(WARNING)<<"output warning log"
LOG(ERROR)<<"out error log"
LOG(FATAL)<<"out fatal log"
上述四個宏,分別記錄四種不同等級的日志。
參數設置
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次記錄一次日志信息(第1、11、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();
}
