作者:高張遠矚(HiLoveS)
部落格:http://www.cnblogs.com/hiloves/
轉載請保留該資訊
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();