Google glog——一個基於程序級記錄日誌信息的c++庫

參考博文 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();
}
相關文章
相關標籤/搜索