C++第三方日志庫Glog的安裝與使用介紹
一、glog介紹
Google Logging(glog)是一個實(shí)現(xiàn)應(yīng)用程序級日志記錄的C++98庫。該庫提供了基于C++風(fēng)格流和各種輔助宏的日志API。
二、glog下載
Glog的地址已經(jīng)從https://code.google.com/p/google-glog/ 變?yōu)榱薶ttps://github.com/google/glog,請從該鏈接地址下載最新版。
官方文檔:http://google-glog.googlecode.com/svn/trunk/doc/glog.html。
三、環(huán)境介紹
本文配置所采用的環(huán)境為Visual Studio2017。
三、glog的編譯詳解
3.1 利用CMake進(jìn)行編譯,生成VS解決方案
首先需要下載并安裝CMake,下載方法參考文章:Windows下CMake的下載與安裝詳解。
然后需要從github上下載glog的源碼。我們這里將源碼下載到文件夾E:\3PartyLibrary下。
然后在glog-master文件夾內(nèi)新建一個build文件夾,用于存放編譯完成的文件。
【注意】:如果建在該文件夾外部,會引發(fā)錯誤!??!
然后使用cmake-gui生成VS解決方案。如下圖所示。
這里選擇你使用的編譯器(我這里使用的是Visual Studio2017),然后在下方輸入x64:
點(diǎn)擊Finish完成。稍等幾分鐘CMake進(jìn)行配置,配置完畢后如下圖所示:
這時需要進(jìn)行如下設(shè)置:
①是BUILD_SHARED_LIBS,這個選項(xiàng)我們要勾上,因?yàn)槲覀冃枰獎討B(tài)庫。
②是CMAKE_INSTALL_PREFIX,這個路徑是install后生成的頭文件和庫文件存放的路徑,這里我們在源碼同級目錄下創(chuàng)建一個文件夾,命名為install。
③和④分別是WITH_GFLAGS和WITH_UNWIND,這兩個我也不是很清楚是做什么的,但是如果把這兩個勾上的話,在cmake的過程中就會報warning,因此都不勾。
之后分別點(diǎn)擊Configure和Generate,生成完成后沒有紅色選項(xiàng)。
3.2 利用VS對項(xiàng)目進(jìn)行編譯
上述步驟生成完畢后,會在build目錄下會生成sln解決方案,使用Visual Studio打開glog.sln解決方案,打開后目錄如下:
選擇Release模式,分別對ALL_BUILD和INSTALL兩個項(xiàng)目進(jìn)行生成,如下圖所示。(如果項(xiàng)目在debug模式下開發(fā),就在debug模式下生成glog的DLL文件;如果項(xiàng)目在release模式下開發(fā),就在release模式下生成glog的DLL文件;我這里選擇的是Release模式)
生成過程應(yīng)該不會有錯誤。
生成成功后就在install目錄下生成頭文件和庫文件。如下圖所示。
ok!以上便是glog編譯的全部內(nèi)容了,接下來的小節(jié)介紹一下glog的基本使用。
四、glog的基本使用
4.1 創(chuàng)建VS項(xiàng)目
新建一個Visual Studio項(xiàng)目,Release生成。
這里,為了代碼目錄結(jié)構(gòu)清晰,將上面生成的頭文件放在了include文件夾中,將上面生成的.lib文件放在了lib文件夾中,將上面生成的.dll文件放在工程所在文件夾中,如下圖所示。
4.2 將glog相關(guān)文件包含在項(xiàng)目中
在使用vs新建項(xiàng)目后,需要將我們上面生成的頭文件包含在項(xiàng)目的Include Directories中,將上面生成的庫文件包含在項(xiàng)目的Library Directories中。如下圖所示。
【注意】:一定要選擇x64和Release?。?!
4.3 編寫代碼進(jìn)行測試
最簡單的測試代碼如下:
#ifndef GLOG_NO_ABBREVIATED_SEVERITIES #define GLOG_NO_ABBREVIATED_SEVERITIES // 如果不加這個宏定義代碼就會報錯 #endif #include <glog/logging.h> #pragma comment(lib, "glog.lib") int main(int argc, char* argv[]) { FLAGS_alsologtostderr = true;//是否將日志輸出到文件和stderr google::InitGoogleLogging("test");//使用glog之前必須先初始化庫,僅需執(zhí)行一次,括號內(nèi)為程序名 LOG(INFO) << "Hello,GLOG!"; google::ShutdownGoogleLogging();//當(dāng)要結(jié)束glog時必須關(guān)閉庫,否則會內(nèi)存溢出 return 0; }
輸出為:
I20220220 14:27:55.136509 5080 test.cpp:9] Hello,GLOG!
【注意】:GLog在整個項(xiàng)目周期中只允許生成一個日志文件,也就是說,glog從初始化到注銷整個過程,不允許再次調(diào)用glog的初始化或者注銷,另一種意思可以理解為只允許有一個實(shí)例化對象。
4.4 測試代碼2
測試代碼如下:
#ifndef GLOG_NO_ABBREVIATED_SEVERITIES #define GLOG_NO_ABBREVIATED_SEVERITIES // 如果不加這個宏定義代碼就會報錯 #endif #include <glog\logging.h> #pragma comment(lib, "glog.lib") int main() { google::InitGoogleLogging("test");//使用glog之前必須先初始化庫,僅需執(zhí)行一次,括號內(nèi)為程序名 FLAGS_alsologtostderr = true;//是否將日志輸出到文件和stderr FLAGS_colorlogtostderr = true;//是否啟用不同顏色顯示 google::SetLogDestination(google::GLOG_INFO, "E:\\logs\\INFO_");//INFO級別的日志都存放到logs目錄下且前綴為INFO_ google::SetLogDestination(google::GLOG_WARNING, "E:\\logs\\WARNING_");//WARNING級別的日志都存放到logs目錄下且前綴為WARNING_ google::SetLogDestination(google::GLOG_ERROR, "E:\\logs\\ERROR_"); //ERROR級別的日志都存放到logs目錄下且前綴為ERROR_ google::SetLogDestination(google::GLOG_FATAL, "E:\\logs\\FATAL_"); //FATAL級別的日志都存放到logs目錄下且前綴為FATAL_ LOG(INFO) << "info"; LOG(WARNING) << "warning"; LOG(ERROR) << "error"; /*LOG(FATAL) << "fatal";*/ google::ShutdownGoogleLogging();//當(dāng)要結(jié)束glog時必須關(guān)閉庫,否則會內(nèi)存溢出 return 0; }
代碼執(zhí)行后,會在E:\logs文件夾下生成四個log文件,這里我沒有將FATAL也打印出來是因?yàn)楫?dāng)glog檢測到"LOG(FATAL)<<"代碼時就會直接結(jié)束程序,不繼續(xù)執(zhí)行后面的代碼。
五、代碼詳解
5.1 define
除了上述在前三行加入代碼外,也可以選擇添加預(yù)處理項(xiàng)。項(xiàng)目屬性 ——> c/c++ ——> 預(yù)處理器。 添加GLOG_NO_ABBREVIATED_SEVERITIES。
5.2 include
在需要使用glog打印日志的cpp文件中包含頭文件,及加載glog庫文件。注意:每個使用glog的cpp文件都要添加,代碼如下:
#include "glog/logging.h" #pragma comment(lib,"libglog.lib")
5.3 InitGoogleLogging
用glog之前必須先初始化庫,要生成日志文件只需在開始log之前調(diào)用一次:
google::InitGoogleLogging(argv[0]); //括號內(nèi)是程序名
5.4 ShutdownGoogleLogging
當(dāng)要結(jié)束glog時必須關(guān)閉庫,否則會內(nèi)存溢出:
google::ShutdownGoogleLogging();
下一篇文章(C++第三方日志庫Glog基本語法介紹)會對glog庫的基本語法進(jìn)行詳細(xì)介紹,歡迎關(guān)注~
參考:
https://blog.csdn.net/w_b_h/article/details/107070652
https://blog.csdn.net/qq_27278957/article/details/84648912
https://blog.csdn.net/fx_odyssey/article/details/102815949
https://blog.csdn.net/weixin_33929309/article/details/85541046
https://www.cnblogs.com/tianyajuanke/archive/2013/02/22/2921850.html
https://my.oschina.net/u/4320185/blog/3755592
到此這篇關(guān)于C++第三方日志庫Glog的安裝與使用介紹的文章就介紹到這了,更多相關(guān)C++第三方日志庫Glog內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++設(shè)計(jì)模式編程中的迭代器模式應(yīng)用解析
這篇文章主要介紹了C++設(shè)計(jì)模式編程中的迭代器模式應(yīng)用解析,迭代器模式注重對集合中元素的遍歷而不使其暴露,需要的朋友可以參考下2016-03-03C語言實(shí)現(xiàn)學(xué)生獎學(xué)金評定系統(tǒng)
這篇文章主要介紹了C語言實(shí)現(xiàn)學(xué)生獎學(xué)金評定系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03C語言 數(shù)據(jù)結(jié)構(gòu)中棧的實(shí)現(xiàn)代碼
這篇文章主要介紹了C語言 數(shù)據(jù)結(jié)構(gòu)中棧的實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-10-10關(guān)于C/C++中的side effect(負(fù)效應(yīng))和sequence point(序列點(diǎn))
不知你在寫code時是否遇到這樣的問題?int i = 3; int x = (++i) + (++i) + (++i); 問x值為多少?進(jìn)行各種理論分析,并在編譯器上實(shí)踐,然而可能發(fā)現(xiàn)最終的結(jié)果是不正確的,也是不穩(wěn)定的,不同的編譯器可能會產(chǎn)生不同的結(jié)果。這讓人很頭疼2013-10-10