做者:高張遠矚(HiLoveS)git
博客:http://www.cnblogs.com/hiloves/github
轉載請保留該信息windows
Google Glog 是一個C++語言的應用級日誌記錄框架,提供了 C++ 風格的流操做和各類助手宏。試用了一下,感受不錯,試用過程出了很多插曲。cookie
一、開源項目首頁已經從https://code.google.com/p/google-glog/遷移到https://github.com/google/glog。當前主版本是0.3.4。多線程
二、下載代碼後,雙擊根目錄下的google-glog.sln,Visual Studio 2015提示先進行遷移,成功後就能夠編譯了。框架
三、在解決方案下有四個工程:libglog(是動態連接庫工程,生成libglog.dll和libglog.lib),libglog_static(是靜態庫工程,生成libglog_static.lib,運行時不須要libglog.dll),logging_unittest和logging_unittest_static是相應的測試工程。函數
四、不須要更改工程屬性。平臺工具集是不是Windows XP(v140_xp)好像並不影響。Glog不支持Unicode寬字符集,工程屬性字符集保持多字節字符集。「C/C++」-「代碼生成」中的「運行庫」,libglog動態庫工程必須選擇「多線程DLL」或「多線程調試DLL」,libglog_static靜態庫工程必須選擇「多線程」或「多線程調試」。工具
五、按須要編譯庫。以靜態庫爲例,動態庫多一步將libglog.dll拷貝到程序目錄下。分別編譯Debug和Release,將Debug版的重命名爲libglog_static_d.lib。將編譯的lib文件拷貝到根目錄\src\glog下,\src\glog是頭文件目錄。這個版本的靜態庫在試用時並未發現有內存泄露問題。測試
六、將\glog目錄(包括了頭文件和庫文件)拷貝到本身的工程目錄下。也能夠新建另外的庫目錄,也能夠在工程屬性的附加目錄中增長相應目錄,這裏採用在代碼文件中控制。在工程資源管理器中添加glog頭文件,若是先添加glog目錄再添加頭文件會提示glog頭文件中的#include路徑出錯,手動刪除路徑中的「glog\」可解決。google
七、在須要的地方#include "glog/logging.h"。建議添加到stdafx.h中。
八、使用靜態庫必須添加#define GOOGLE_GLOG_DLL_DECL。動態庫沒必要添加。
九、因windows.h中定義的宏ERROR,與glog中定義的宏ERROR衝突,因此若是#include <windows.h>後要添加#define GLOG_NO_ABBREVIATED_SEVERITIES,而且代碼中要用google::GLOG_ERROR來代替原來的google::ERROR,相應的其餘也改成:GLOG_INFO、GLOG_WARNING、GLOG_FATAL。
十、添加庫文件:#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
十一、本身的工程使用靜態庫時,必須選擇「多線程」或「多線程調試」。使用動態庫則選擇「多線程DLL」或「多線程調試DLL」。
十二、使用glog以前必須先初始化庫,要生成日誌文件只需在開始log以前調用一次:
google::InitGoogleLogging(argv[0]); //括號內是程序名
當要結束glog時必須關閉庫,不然會內存溢出:
google::ShutdownGoogleLogging();
1三、設置日誌文件保存目錄,這個目錄必須是已經存在的,不然不能生成日誌文件。必須在初始化庫以前調用。
FLAGS_log_dir = "c:\\Logs";
1四、GLOG 有四個錯誤級別,枚舉以下:
enum SeverityLevel { google::INFO = 0, google::WARNING = 1, google::ERROR = 2, google::FATAL = 3, };
1五、輸出日誌:
LOG(INFO) << "info test"; //輸出一個Info日誌 LOG(WARNING) << "warning test"; //輸出一個Warning日誌 LOG(ERROR) << "error test"; //輸出一個Error日誌 LOG(FATAL) << "fatal test"; //輸出一個Fatal日誌,這是最嚴重的日誌而且輸出以後會停止程序
1六、條件輸出:
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 次都輸出日誌,而後再也不輸出
1七、幾個函數:
google::SetLogDestination(google::GLOG_INFO, "log/prefix_"); //設置特定嚴重級別的日誌的輸出目錄和前綴。第一個參數爲日誌級別,第二個參數表示輸出目錄及日誌文件名前綴 google::SetLogFilenameExtension("logExtension"); //在日誌文件名中級別後添加一個擴展名。適用於全部嚴重級別 google::SetStderrLogging(google::GLOG_INFO); //大於指定級別的日誌都輸出到標準輸出
1八、幾個參數設置:
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; //設置是否在磁盤已滿時避免日誌記錄到磁盤
1九、例子:
// 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();