glog日誌庫,是谷歌開源的日誌庫。
由於前兩天發生了一次生產事故,一個C++程序的日誌裏面記錄了很多亂碼以及其他模塊中的數據,初步懷疑是內存管理異常造成的,最大的疑慮在於日誌記錄模塊的多線程支持,原先的模塊在單線程下沒有任何問題,但是多線程下並沒有經過穩定的壓力測試,爲了一了百了地解決,還是選用技術實例強勁的開源庫吧,原先的庫就留着開發測試小功能裏面用用。
glog庫,可以從github上下載。 https://github.com/google/glog
我的開發環境是windows10+vs2017,所以下載完成之後,解壓縮,然後使用cmake-gui進行轉換爲vs2017的sln工程文件:
- 選擇源代碼爲glog的目錄,目標位置爲glog目錄下新建一個build-cmake,
- 在configure按鈕點擊,彈出窗口選擇vs2017(這個都是默認會檢測到電腦上的vs版本,如果要轉換爲64位的,則選擇帶有win64的,默認是32位,默認生成靜態庫)
- 點擊generate,然後到build-cmake目錄下就會生成vs2017的工程文件glog.sln,雙擊打開工程,分別在debug和release下編譯,生成glogd.lib和glog.lib,這裏我使用靜態庫。
現在glog的庫文件已經有了,我同時編譯了32位和64位兩個版本。以及debug版本和release版本。
然後新建一個測試工程,我選用的是64位的工程,
- 添加glogd.lib和glog.lib以及build-cmake/glog下面的頭文件到工程中去,添加glogd.lib和glog.lib,添加src/glog/log_severity.h文件。所有的添加操作都是拷貝。
- 在工程屬性中,文件引入目錄包含以上添加的文件目錄,庫引用目錄也是如此。同時注意工程屬性中C/C++->代碼生成->運行庫的參數,我選擇的都是 “/MTd”,編譯glog庫工程和測試工程的這個選擇要一致。
- 創建測試代碼,需要在開頭加上 GLOG_NO_ABBREVIATED_SEVERITIES和GOOGLE_GLOG_DLL_DECL,不然會報錯。
- 然後就可以使用啦,可以參考如下我的測試代碼,使用了兩個線程同時寫入,方便測試是否線程安全。可以參考我的github,
#pragma once #define GLOG_NO_ABBREVIATED_SEVERITIES #define GOOGLE_GLOG_DLL_DECL #include "logging.h" using namespace google;
#ifdef _DEBUG
#pragma comment(lib, "glogd.lib")
#else
#pragma comment(lib, "glog.lib")
#endif // DEBUG
void testGlog2()
{
char str[20] = "hello log!";
int i = 100000;
while (i > 0) {
// LOG(INFO) << str;
LOG(INFO) << "2info 2test" << "2hello 2log!"; //輸出一個Info日誌
// LOG(WARNING) << "warning test"; //輸出一個Warning日誌
// LOG(ERROR) << "error test"; //輸出一個Error日誌
i--;
}
}
void testGlog()
{
// Start google log system:
FLAGS_log_dir = "E:\logs";
google::InitGoogleLogging("loglog");
google::SetLogDestination(google::GLOGINFO, "E:\logs\INFO");
google::SetStderrLogging(google::GLOGFATAL);
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
thread *t = new thread(testGlog2);
char str[20] = "hello log!";
int i = 100000;
while (i > 0) {
// LOG(INFO) << str;
LOG(INFO) << "info test" << "hello log!"; //輸出一個Info日誌
// LOG(WARNING) << "warning test"; //輸出一個Warning日誌
// LOG(ERROR) << "error test"; //輸出一個Error日誌
i--;
}
t->join();
google::ShutdownGoogleLogging();
}