1. 程式人生 > >Google-glog 日誌庫使用手記

Google-glog 日誌庫使用手記

Google Glog 是一個C++語言的應用級日誌記錄框架,提供了 C++ 風格的流操作和各種助手巨集。試用了一下,感覺不錯,試用過程出了不少插曲。

1、開源專案首頁已經從https://code.google.com/p/google-glog/遷移到https://github.com/google/glog。當前主版本是0.3.4。

2、下載程式碼後,雙擊根目錄下的google-glog.sln,Visual Studio 2015提示先進行遷移,成功後就可以編譯了。

3、在解決方案下有四個工程:libglog(是動態連結庫工程,生成libglog.dll和libglog.lib),libglog_static(是靜態庫工程,生成libglog_static.lib,執行時不需要libglog.dll),logging_unittest和logging_unittest_static是相應的測試工程。

4、不需要更改工程屬性。平臺工具集是否是Windows XP(v140_xp)好像並不影響。Glog不支援Unicode寬字符集,工程屬性字符集保持多位元組字符集。“C/C++”-“程式碼生成”中的“執行庫”,libglog動態庫工程必須選擇“多執行緒DLL”或“多執行緒除錯DLL”,libglog_static靜態庫工程必須選擇“多執行緒”或“多執行緒除錯”。

5、按需要編譯庫。以靜態庫為例,動態庫多一步將libglog.dll拷貝到程式目錄下。分別編譯Debug和Release,將Debug版的重新命名為libglog_static_d.lib。將編譯的lib檔案拷貝到根目錄\src\glog下,\src\glog是標頭檔案目錄。這個版本的靜態庫在試用時並未發現有記憶體洩露問題。

6、將\glog目錄(包括了標頭檔案和庫檔案)拷貝到自己的工程目錄下。也可以新建另外的庫目錄,也可以在工程屬性的附加目錄中增加相應目錄,這裡採用在程式碼檔案中控制。在工程資源管理器中新增glog標頭檔案,如果先新增glog目錄再新增標頭檔案會提示glog標頭檔案中的#include路徑出錯,手動刪除路徑中的“glog\”可解決。

7、在需要的地方#include "glog/logging.h"。建議新增到stdafx.h中。 

8、使用靜態庫必須新增#define GOOGLE_GLOG_DLL_DECL。動態庫不必新增。

9、因windows.h中定義的巨集ERROR,與glog中定義的巨集ERROR衝突,所以如果#include <windows.h>後要新增#define GLOG_NO_ABBREVIATED_SEVERITIES,並且程式碼中要用google::GLOG_ERROR來代替原來的google::ERROR,相應的其他也改為:GLOG_INFO、GLOG_WARNING、GLOG_FATAL。

10、新增庫檔案:#pragma comment(lib,"glog/libglog_static.lib")。針對Debug和Release版,用#ifdef控制。

複製程式碼

1 #define GOOGLE_GLOG_DLL_DECL
2 #define GLOG_NO_ABBREVIATED_SEVERITIES
3 #include "glog/logging.h"
4 
5 #ifdef DEBUG
6     #pragma comment(lib,"glog/libglog_static_d.lib")
7 #else
8     #pragma comment(lib,"glog/libglog_static.lib")
9 #endif // DEBUG

複製程式碼


11、自己的工程使用靜態庫時,必須選擇“多執行緒”或“多執行緒除錯”。使用動態庫則選擇“多執行緒DLL”或“多執行緒除錯DLL”。

12、使用glog之前必須先初始化庫,要生成日誌檔案只需在開始log之前呼叫一次:

google::InitGoogleLogging(argv[0]);  //括號內是程式名

當要結束glog時必須關閉庫,否則會記憶體溢位:

google::ShutdownGoogleLogging();

13、設定日誌檔案儲存目錄,這個目錄必須是已經存在的,否則不能生成日誌檔案。必須在初始化庫之前呼叫。

FLAGS_log_dir = "c:\\Logs";

14、GLOG 有四個錯誤級別,列舉如下:

複製程式碼

enum SeverityLevel
{
  google::INFO = 0,
  google::WARNING = 1,
  google::ERROR = 2,
  google::FATAL = 3,
};

複製程式碼

15、輸出日誌:

LOG(INFO) << "info test";  //輸出一個Info日誌
LOG(WARNING) << "warning test";  //輸出一個Warning日誌
LOG(ERROR) << "error test";  //輸出一個Error日誌
LOG(FATAL) << "fatal test";  //輸出一個Fatal日誌,這是最嚴重的日誌並且輸出之後會中止程式

16、條件輸出:

複製程式碼

LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";  //當條件滿足時輸出日誌

LOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie";  //google::COUNTER 記錄該語句被執行次數,從1開始,在第一次執行輸出日誌之後,每隔 10 次再輸出一次日誌資訊

LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTER << "th big cookie";  //上述兩者的結合,不過要注意,是先每隔 10 次去判斷條件是否滿足,如果滯則輸出日誌;而不是當滿足某條件的情況下,每隔 10 次輸出一次日誌資訊

LOG_FIRST_N(INFO, 20) << "Got the " << google::COUNTER << "th cookie";  //當此語句執行的前 20 次都輸出日誌,然後不再輸出

複製程式碼

17、幾個函式:

google::SetLogDestination(google::GLOG_INFO, "log/prefix_");  //設定特定嚴重級別的日誌的輸出目錄和字首。第一個引數為日誌級別,第二個引數表示輸出目錄及日誌檔名字首

google::SetLogFilenameExtension("logExtension");  //在日誌檔名中級別後新增一個副檔名。適用於所有嚴重級別

google::SetStderrLogging(google::GLOG_INFO);  //大於指定級別的日誌都輸出到標準輸出

18、幾個引數設定:

複製程式碼

FLAGS_logtostderr = true;  //設定日誌訊息是否轉到標準輸出而不是日誌檔案

FLAGS_alsologtostderr = true;  //設定日誌訊息除了日誌檔案之外是否去標準輸出

FLAGS_colorlogtostderr = true;  //設定記錄到標準輸出的顏色訊息(如果終端支援)

FLAGS_log_prefix = true;  //設定日誌字首是否應該新增到每行輸出

FLAGS_logbufsecs = 0;  //設定可以緩衝日誌的最大秒數,0指實時輸出

FLAGS_max_log_size = 10;  //設定最大日誌檔案大小(以MB為單位)

FLAGS_stop_logging_if_full_disk = true;  //設定是否在磁碟已滿時避免日誌記錄到磁碟

複製程式碼

 19、例子:

複製程式碼

// Start google log system:
FLAGS_log_dir = "c:\\Logs";
google::InitGoogleLogging(argv[0]);
google::SetLogDestination(google::GLOG_INFO, "c:\\Logs\\INFO_");
google::SetStderrLogging(google::GLOG_INFO);
google::SetLogFilenameExtension("log_");
FLAGS_colorlogtostderr = true;  // Set log color
FLAGS_logbufsecs = 0;  // Set log output speed(s)
FLAGS_max_log_size = 1024;  // Set max log file size
FLAGS_stop_logging_if_full_disk = true;  // If disk is full
char str[20] = "hello log!";
LOG(INFO) << str;
CStringA cStr = "hello google!";
LOG(INFO) << cStr;
LOG(INFO) << "info test" << "hello log!";  //輸出一個Info日誌
LOG(WARNING) << "warning test";  //輸出一個Warning日誌
LOG(ERROR) << "error test";  //輸出一個Error日誌
google::ShutdownGoogleLogging();

複製程式碼