關於windows下glog日誌庫使用

glog日誌庫,是谷歌開源的日誌庫。

由於前兩天發生了一次生產事故,一個C++程序的日誌裏面記錄了很多亂碼以及其他模塊中的數據,初步懷疑是內存管理異常造成的,最大的疑慮在於日誌記錄模塊的多線程支持,原先的模塊在單線程下沒有任何問題,但是多線程下並沒有經過穩定的壓力測試,爲了一了百了地解決,還是選用技術實例強勁的開源庫吧,原先的庫就留着開發測試小功能裏面用用。

glog庫,可以從github上下載。 https://github.com/google/glog

我的開發環境是windows10+vs2017,所以下載完成之後,解壓縮,然後使用cmake-gui進行轉換爲vs2017的sln工程文件:

  1. 選擇源代碼爲glog的目錄,目標位置爲glog目錄下新建一個build-cmake,
  2. 在configure按鈕點擊,彈出窗口選擇vs2017(這個都是默認會檢測到電腦上的vs版本,如果要轉換爲64位的,則選擇帶有win64的,默認是32位,默認生成靜態庫)
  3. 點擊generate,然後到build-cmake目錄下就會生成vs2017的工程文件glog.sln,雙擊打開工程,分別在debug和release下編譯,生成glogd.lib和glog.lib,這裏我使用靜態庫。

現在glog的庫文件已經有了,我同時編譯了32位和64位兩個版本。以及debug版本和release版本。

然後新建一個測試工程,我選用的是64位的工程,

  1. 添加glogd.lib和glog.lib以及build-cmake/glog下面的頭文件到工程中去,添加glogd.lib和glog.lib,添加src/glog/log_severity.h文件。所有的添加操作都是拷貝。
  2. 在工程屬性中,文件引入目錄包含以上添加的文件目錄,庫引用目錄也是如此。同時注意工程屬性中C/C++->代碼生成->運行庫的參數,我選擇的都是 “/MTd”,編譯glog庫工程和測試工程的這個選擇要一致。
  3. 創建測試代碼,需要在開頭加上 GLOG_NO_ABBREVIATED_SEVERITIES和GOOGLE_GLOG_DLL_DECL,不然會報錯。
  4. 然後就可以使用啦,可以參考如下我的測試代碼,使用了兩個線程同時寫入,方便測試是否線程安全。可以參考我的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();

}

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