天天看點

google-glog:開源c++輕量級日志庫glog簡介安裝 和 使用主要内容

glog簡介

Google glog is a library that implements application-level logging. This library provides logging APIs based on C++-style streams and various helper macro.

  • 參數設定,以指令行參數的方式設定标志參數來控制日志記錄行為;
  • 嚴重性分級,根據日志嚴重性分級記錄日志;
  • 可有條件地記錄日志資訊;
  • 條件中止程式。豐富的條件判定宏,可預設程式終止條件;
  • 異常信号處理。程式異常情況,可自定義異常處理過程;
  • 支援debug功能;
  • 自定義日志資訊;
  • 線程安全日志記錄方式;
  • 系統級日志記錄;
  • google perror風格日志資訊;
  • 精簡日志字元串資訊

安裝 和 使用

下載下傳位址:

https://code.google.com/p/google-glog/downloads/list

解壓安裝:

tar zxvf glog-.tar.gz && cd glog- && ./configure && make
           

頭檔案目錄為 /src/glog ,連結庫為 .libs/libglog.{a,so}

幫助文檔為 doc/glog.html 或直接通路以下 URL: http://google-glog.googlecode.com/svn/trunk/doc/glog.html

簡單Demo

#include <glog/logging.h>

int main(int argc,char* argv[])
{
    LOG(INFO) << "Hello,GLOG!";
}
           

隻需要include logging.h頭檔案 連結時,需要 -lglog -lpthread

主要内容

日志

日志等級

enum SeverityLevel
{
  google::INFO = ,
  google::WARNING = ,
  google::ERROR = ,
  google::FATAL = ,
};
           

在輸出FATAL日志消息後,會終止程式運作

DEBUG模式中,DFATAL級别對應ERROR–便于調試,而非DEBUG模式則對應FATAL

日志檔案

每個級别都對應有相應的日志檔案,日志檔案的位置及名稱定義如下:

  • windows下是”C:\Users\user_name\AppData\Local\Temp”
  • Linux是”/tmp”

檔案名稱:

programname.hostname.user_name.log.severity_level.date.time.pid

Linux還會建立為每個檔案建立一個檔案連結

如果日志輸出超過 FLAGS_max_log_size 設定的大小,則會分為多個檔案存儲,連結檔案就會指向其中最新的對應級别的日志檔案。是以當日志檔案較多時,檢視連結檔案來檢視最新日志挺友善的。

輸出規則:

- 每個級别的日志除了輸出到對應日志檔案中,還輸出到每個低級别日志檔案中

- 如一個ERROR日志,會輸出到INFO,WARNING,ERROR三個日志檔案中

- 預設,ERROR和FATAL消息除了輸出到日志檔案中之外,還會輸出到标準錯誤中

符号變量

通過符号變量可以定制日志行為

在程式中,通過修改全局變量(使用字首”FLAGS_”)來設定符号變量

- 大多數符号變量修改後會立即生效

- 與輸出位置有關(如FLAGS_log_dir),如果要生效需要在google::InitGoogleLogging()之前設定

列舉符号變量

(可參見源碼src/glog/logging.h line:321-361):

  • logtostderr(bool,default=false),隻輸出到STDERR而不寫入日志檔案
  • stderrthreshold(int,default=ERROR),高于該級别的日志除寫入日志檔案還輸出到STDERR
  • minloglevel(int,default=INFO),低于該級别的日志消息不輸出
  • colorlogtostderr(bool, default=false),将輸出到 stderr 上的錯誤日志顯示相應的顔色
  • log_dir(string,default=”“),日志輸出目錄
  • v(int,default=0),小于等于該值的VLOG(m)會被輸出,否則不會輸出
  • vmodule(string,default=”“),可為源檔案定制VLOG日志輸出級别
  • max_log_size(int,default=1800),日志檔案最大值(機關MB)
  • log_link(string,default=”“),日志檔案的連接配接所在的檔案夾
  • stop_logging_if_full_disk(bool,default=false),如果磁盤寫滿是否停止記錄日志
  • alsologtoemail(string,default=”“),是否将日志額外發送郵件到指定位址
  • logemaillevel(int,default=999),設定發送郵件的日志等級
  • logmailer(string,default=”/bin/mail”),發送郵件程式

APIs

  • void google::InitGoogleLogging(const char* argv0)

    初始化glog庫,參數是第一個指令行參數即程式名

  • void google::ShutdownGoogleLogging()

    關閉glog庫

  • void google::FlushLogFiles(LoSeverity min_severity)

    [Thread-safe]指定級别以上的所有日志消息都立即寫入到日志檔案

  • void google::FlushLogFilesUnsafe(LogSeverity min_severity)

    非線程安全的輸出指定級别以上的日志消息,用于災難性程式問題時輸出必要的日志消息

  • void google::SetLogDestination(LogSeverity severity,const char*

    base_filename)

    [Thread-safe]設定指定級别的日志輸出的日志檔案,如果base_filename為”“則表示該級别日志不輸出

  • void google::SetLogSymlink(LogSeverity severity,const char*

    symlink_basename)

    [Thread-safe]設定置頂級别的日志檔案的軟連接配接,symlik_basename為空表示不設定軟連接配接。如果不調用該函數,系統預設連接配接名稱是程式名

  • void google::AddLogSink(LogSink *destination)

    void google::RemoveLogSink(LogSink *destination)

    Thread-safe]添加和删除日志輸出管道

  • void google::SetLogFilenameExtension(const char* filename_extension)

    [Thread-safe]為所有日志檔案添加檔案擴充名,特别用于SetLogDestination()設定的日志檔案

    通常做法是将監聽的端口号作為日志檔案擴充名

  • void google::SetStderrLogging(LogSeverity

    min_severity)

    [Thread-safe]确定除了輸出到日志檔案同時還輸出到STDERR的日志最小級别

  • void google::LogToStderr()

    [Thread-safe]設定隻隻将日志輸出到STDERR而不輸出到日志檔案

  • void google::SetEmailLogging(LogSeverity min_severity,const char* address)

    [Thread-safe]設定發送郵件的日志最小級别

  • bool google::SendEmail(const char dest,const char subject,const char *body)

    [Thread-safe]發送郵件

  • const std::vector& google::GetLoggingDirectories()

    擷取日志輸出目錄集合

  • void google::InstallFailureSignalHandler()

    信号處理函數,處理的主要信号有SIGSEGV/SIGILL/SIGFPE/SIGBRT/SIGBUS/SIGTERM

  • void google::InstallFailureWriter(void (writer)(const char data,int size))

    設定系統崩潰時的輸出函數,data資料不一定是以’\0’結尾

  • void google::InstallFailureFunction(void (*fail_func)())

    設定LOG(FATAL)在輸出日志消息後調用的函數

處理core dumped

通過 google::InstallFailureSignalHandler()注冊,預設捕捉 SIGSEGV 信号資訊輸出會輸出到 stderr;

通過 google::InstallFailureFunction(void (*func)())定制錯誤處理

通過 google::InstallFailureWriter(void (writer)(const char data,int size)) 自定義輸出方式,例如:

#include <glog/logging.h>
#include <string>
#include <fstream>

//将資訊輸出到單獨的檔案和 LOG(ERROR)
void SignalHandle(const char* data, int size)
{
    std::ofstream fs("glog_dump.log",std::ios::app);
    std::string str = std::string(data,size);
    fs<<str;
    fs.close();
    LOG(ERROR)<<str;
}

class GLogHelper
{
public:
    GLogHelper(char* program)
    {
        google::InitGoogleLogging(program);
        FLAGS_colorlogtostderr=true;
        google::InstallFailureSignalHandler();
        //預設捕捉 SIGSEGV 信号資訊輸出會輸出到 stderr,可以通過下面的方法自定義輸出方式:
        google::InstallFailureWriter(&SignalHandle);
    }
    ~GLogHelper()
    {
        google::ShutdownGoogleLogging();
    }
};

void fun()
{
    int* pi = new int;
    delete pi;
    pi = ;
    int j = *pi;
}

int main(int argc,char* argv[])
{
    GLogHelper gh(argv[]);
    fun();
}
           

條件宏

  • LOG_IF(INFO, num_cookies > 10) << “Got lots of cookies”;

    上面的語句表示,隻有當num_cookies > 10條件成立時,“Got lots of cookies”日志資訊才被記錄。

  • LOG_EVERY_N(INFO, 10) << “Got the ” << COUNTER << “th cookie”;

    上面的語句表示,在程式中周期性的記錄日志資訊,在該語句第1、11、21……次被執行的時候,記錄日志資訊。COUNTER變量表示該語句被執行的次數。

  • LOG_IF_EVERY_N(INFO, (size > 1024), 10) << “Got the ” << COUNTER<<”th big cookie”;

    上面的語句為前兩項功能的合并,size>1024的條件連續成立10次的時候記錄日志資訊。COUNTER變量表示該條件成立的次數。

  • LOG_FIRST_N(INFO, 20) << “Got the ” << COUNTER << “th cookie”;

    上面的語句表示,當該語句隻在首次執行了20次以後記錄日志資訊, COUNTER變量表示該語句被執行的次數。

條件宏中,如果為假則右邊日志中的函數不會執行

CHECK 宏

當通過該宏指定的條件不成立的時候,程式會中止,并且記錄對應的FATAL日志資訊。功能類似于ASSERT,差別是 CHECK 宏不受 NDEBUG 限制,在 release 版中同樣有效。

  • CHECK(condition)

    參數會是匿名參數如CHECK(string(“abc”)[1],’b’)

  • 比較驗證:

    在輸出中會輸出比較值,是以要求比較值重載了輸出操作符(operator<<(ostream,…))

    • CHECK_EQ(arg1,arg2)
    • CHECK_NE(arg1,arg2)
    • CHECK_LE(arg1,arg2)
    • CHECK_LT(arg1,arg2)
    • CHECK_GE(arg1,arg2)
    • CHECK_GT(arg1,arg2)
  • CHECK_NOTNULL(arg)

    不能作為日志輸出流使用

  • 字元串比較:
    • CHECK_STREQ
    • CHECK_STRNE
    • CHECK_STRCASEEQ
    • CHECK_STRCASENE
  • 浮點數驗證:
    • CHECK_DOUBLE_EQ
    • CHECK_NEAR

TODO

  • 定制日志(Verbose Logging)
  • debug功能
  • ……

參考:

google-glog 開源庫分析

glog

google-glog功能介紹

繼續閱讀