如何使用Google日誌庫

Google Glog 是一個C++語言的應用級日誌記錄框架,提供了 C++ 風格的流操作和各種助手宏。

1、開源項目首頁已經從https://code.google.com/p/google-glog/遷移到https://github.com/google/glog。

2、下載代碼後,雙擊根目錄下的google-glog.sln3、在解決方案下有四個工程: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控制。

#define GOOGLE_GLOG_DLL_DECL
#define GLOG_NO_ABBREVIATED_SEVERITIES

#include "glog/logging.h"
#ifdef DEBUG

     #pragma comment(lib,"glog/libglog_static_d.lib")

 #else
     #pragma comment(lib,"glog/libglog_static.lib")
 #endif // DEBUG

11、自己的工程使用靜態庫時,必須選擇“多線程”或“多線程調試”。使用動態庫則選擇“多線程DLL”或“多線程調試DLL”。

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

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

13、設置日誌文件保存目錄,這個目錄必須是已經存在的,否則不能生成日誌文件。必須在初始化庫之前調用。

        FLAGS_log_dir = "c:\\Logs";

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

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、Google日誌庫使用實例

    幾個比較簡單的選項 :

1、裏面有以FLAGS_ 開頭的全局變量,可以代替以 GLOG_ 開頭的環境變量,FLAGS_log_dir = "./"; //等效於設置環境變量 GLOG_log_dir = "./" ,而且前者優先級高。每個GLOG_開頭的設置項都有對應的FLAGS_開頭的全局變量,在程序記錄日誌前修改有效。

2、//設置日誌文件路徑,指定其基本名稱

google::SetLogDestination(google::INFO,"./mylog_");//大於INFO級別的,記錄在當前目錄,文件以爲mylog_前綴

google::SetLogDestination(google::ERROR,"");//不爲ERROR建立日誌文件

google::SetLogDestination(google::WARNING,"");

3、//其他配置

google::SetStderrLogging(google::INFO);//配置輸出到標準錯誤輸出的最低日記級別。

google::LogToStderr();//只輸出到標準錯誤輸出

 

測試代碼如下。

#include <glog/logging.h>

int main(int argc, char* argv[])

{

//Initialize Google's logging library.

google::InitGoogleLogging(argv[0]);

google::SetLogDestination(google::INFO,"./test_log/");//大於INFO級別的,日誌文件放在當前路徑的test_log文件夾下面。不設置的話默認在系統/tmp/下面,INFO, ERROR,WARNING按文件分開。

google::SetStderrLogging(google::INFO);//配置輸出到標準錯誤輸出的最低日記級別(輸出了所有日誌)

char lv[10] = "l loveyou";

int num_cookies = 10;

int addr = 34;

for(int i = 0; i < 5; ++i)

{

LOG(INFO) << "Found " << num_cookies+i<<":--->"<< lv<< " cookies";

LOG(WARNING) <<"warn 地址: "<<&addr;

LOG(ERROR) <<" value: "<<addr;

}

return 0;

}

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章