glog 入門教程

工程師WWW發表於2013-10-29

glog的簡單入門,glog雖然在配置引數方面比較麻煩,但是在小規模程式中,由於其簡單靈活,也許會有優勢。

glog google的開源日誌系統,相比較log4系列的日誌系統,它更加輕巧靈活,而且功能也比較完善。 結合之前看的一些資料, 這裡簡單對其做個簡介。

 

1, 安裝:

最新版本:0.3.1  http://code.google.com/p/google-glog/

安裝只需:./configure; make; make install

 

2, 簡單示例

main.cpp:

#include <iostream>

#include "glog/logging.h"   // glog 標頭檔案

using namespace std;

int main(int argc, char** argv) {

  google::InitGoogleLogging(argv[0]);    // 初始化

  // FLAGS_log_dir=".";   //設定log目錄

  LOG(INFO) << "hello glog";     // 列印log“hello glog.  類似於C++ stream

}

Makefile:

LIB=$(HOME)/install/glog/lib    #glog 安裝路徑

INCLUDE=$(HOME)/install/glog/include

test_glog : main.o

        g++ -o $@ $^ -L$(LIB) -lglog –lpthread   #-lpthread 因為glog在多執行緒中需要一些鎖機制。

main.o: main.cpp

        g++ -c -o $@ $^ -I$(INCLUDE)

說明:

glog 預設對log分為4級: INFO,  WARNING,  ERROR,  FATAL.  列印log語句類似於C++中的stream,實際上LOG(INFO) 巨集返回的是一個繼承自std::ostrstream類的物件。

編譯執行上述demo glog預設會在/tmp/目錄下生成log日誌檔案test_glog.search-x2.username.log.INFO.20111003-161341.2083

檔名各欄位對應含義為:

<program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>

其中:

1),<program name> 其實對應google::InitGoogleLogging(argv[0]);中的argv[0],即通過改變google::InitGoogleLogging的引數可以修改日誌檔案的名稱。

2),每個級別的日誌會輸出到不同的檔案中。並且高階別日誌檔案會同樣輸入到低階別的日誌檔案中。 即:FATAL的資訊會同時記錄在INFOWARNINGERRORFATAL日誌檔案中。預設情況下,glog還會將會將FATAL的日誌傳送到stderr中。

 

現在的問題是:log總不能都列印到/tmp/目錄下吧。下面的小結來解決:

 

3, 引數設定:

不同於log4系列的日誌系統通過配置檔案的方式, glog採用命令的方式來來配置引數。在glog的官方文件裡,提到如下兩種方式來配置引數(以修改日誌目錄為例:)

1),gflags

./your_application --log_dir=.

gflags 我還沒有使用過)

2),export 修改環境變數,如下所示:修改GLOG_log_dir為上層目錄

 

3)以上兩種方法都需要使用命令列,除此之外,還可以直接在程式中指定(官方文件中沒有提到, glog原始碼中也不鼓勵這麼用,但確實是可行的):

glog/logging.h 標頭檔案287---350行,有諸如“GLOG_log_dir”等變數的巨集定義, 則其GLOG_log_dir實際為FLAGS_log_dir,  因此只需要在程式中設定FLAGS_log_dir的值即可。其他變數類似。取消main.cpp中的註釋行“// FLAGS_log_dir=".";  試試吧

 

4,  glog 支援功能列表如下

1 引數設定,以命令列引數的方式設定標誌引數來控制日誌記錄行為;

2 嚴重性分級,根據日誌嚴重性分級記錄日誌;

3 可有條件地記錄日誌資訊;

4 條件中止程式。豐富的條件判定巨集,可預設程式終止條件;

5 異常訊號處理。程式異常情況,可自定義異常處理過程;

6 支援debug功能。可只用於debug模式;

7 自定義日誌資訊;

8 執行緒安全日誌記錄方式;

9 系統級日誌記錄;

10 google perror風格日誌資訊;

11 精簡日誌字串資訊。

功能點12demo例項。 其他功能見在如下連結講的簡單明瞭,在此也不一一細說:

1)官方文件(英文): http://google-glog.googlecode.com/svn/trunk/doc/glog.html#verbose

2)有網友的中文翻譯:http://mengjh.blog.51cto.com/2860827/546766

 

5,  總結glog簡單易用,缺點感覺還是配置引數不如log4系列使用配置檔案來的方便。在小規模程式(單元測試?功能點自測)中使用,應該是個不錯的選擇吧。



附:

1、簡介
     glog 是google的開源日誌系統,本質上是一個程式級記錄日誌資訊的c++庫,程式設計使用方式與c++的stream操作類似,例如:

  1. LOG(INFO) << "Hello Glog"

2、安裝
    下載連線:http://code.google.com/p/google-glog/
    安裝:
./configure && make && make install
3、日誌嚴重等級
      glog可通過根據指定的嚴重性等級,來選擇性記錄日誌。日誌資訊嚴重性等級按由低到高排列依次為:INFO, WARNING, ERROR, 和 FATAL四級。使用者可以在命令列中設定嚴重性等級門限值來控制日誌的輸出。

4、程式設計試用
  1. #include<iostream>   
  2. #include<stdlib.h>   
  3. #include<stdio.h>   
  4. #include<string>   
  5.    
  6. //glog   
  7. #include<glog/logging.h>   
  8. using namespace std;   
  9.    
  10. int main()   
  11. {   
  12.     // HOME_PATH   
  13.     string home = "./log/";  //要先建立此目錄,否則執行報錯.
  14.     //glog init   
  15.     google::InitGoogleLogging(argv[0]);   
  16.     string info_log = home + "master_info_";   
  17.     google::SetLogDestination(google::INFO, info_log.c_str());   
  18.     string warning_log = home + "master_warning_";   
  19.     google::SetLogDestination(google::WARNING, warning_log.c_str());   
  20.     string error_log = home + "master_error_";   
  21.     google::SetLogDestination(google::ERROR, error_log.c_str());   
  22.     string fatal_log = home + "master_fatal_";   
  23.     google::SetLogDestination(google::FATAL, fatal_log.c_str());   
  24.       
  25.     LOG(INFO)<<"Hello Glog";  
  26.     return 0;   
  27. }   

5、編譯:假設原始檔命名為a.cpp
        g++ a.cpp -o a -lglog -lpthread