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


參考博文
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();
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM