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