glog日志庫使用筆記

  日志能方便地診斷程序原因、統計程序運行數據,是大型軟件系統必不可少的組件之一。glog?是google的開源日志系統,相比較log4系列的日志系統,它更加輕巧靈活。

  在Github上下載glog,解壓后用CMake生成VS2017工程(默認生成的是靜態鏈接庫glogd.lib):

  在64位的windows系統中,一個64位進程不能加載一個32位dll,同理一個32位進程也不能加載一個64位dll,因此要注意應用程序和glog庫版本的統一。編譯成功后,在build\Debug文件夾下會生成glogd.lib庫文件。? ?src\windows路徑下的glog文件夾包含Windows平臺所需的頭文件:

?  使用glog時可以在項目“屬性→C/C++→常規→附加包含目錄”中設置glog頭文件路徑,也可以直接將windows/glog文件夾復制到VS2017的安裝路徑中:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include

?  新建一個簡單的x64的Debug工程進行測試,在“項目屬性→鏈接器→輸入→附加依賴項”中加入glogd.lib,并在“項目屬性→鏈接器→常規→附加庫目錄”中輸入glogd.lib的路徑。進行編譯:

#include <glog/logging.h>int main(int argc, char* argv[]) {// Initialize Google's logging library.google::InitGoogleLogging(argv[0]);// ...int num_cookies = 100;LOG(INFO) << "Found " << num_cookies << " cookies";return 0;
}

  結果出現錯誤:

1>ConsoleApplication1.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) void __cdecl google::InitGoogleLogging(char const *)" (__imp_?InitGoogleLogging@google@@YAXPEBD@Z),該符號在函數 main 中被引用
1>ConsoleApplication1.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: __cdecl google::LogMessage::LogMessage(char const *,int)" (__imp_??0LogMessage@google@@QEAA@PEBDH@Z),該符號在函數 main 中被引用
1>ConsoleApplication1.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: __cdecl google::LogMessage::~LogMessage(void)" (__imp_??1LogMessage@google@@QEAA@XZ),該符號在函數 main 中被引用
1>ConsoleApplication1.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl google::LogMessage::stream(void)" (__imp_?stream@LogMessage@google@@QEAAAEAV?$basic_ostream@DU?$char_traits@D@std@@@std@@XZ),該符號在函數 main 中被引用
1>C:\Users\Thinkpad\Desktop\ConsoleApplication1\x64\Debug\ConsoleApplication1.exe : fatal error LNK1120: 4 個無法解析的外部命令

?  參考其他文檔,在預處理器定義中添加GOOGLE_GLOG_DLL_DECL=宏后解決:

  運行程序發現并沒有信息輸出到控制臺中,如果沒有設置日志存放的文件夾,它們會被存放到指定的路徑(windows平臺上會默認存放到$(LOCALAPPDATA)的Temp文件夾下。如C:\Users\Thinkpad\AppData\Local\Temp,路徑中的“Thinkpad”是計算機當前的用戶名),你可以找到以特定格式命名的文件,格式為:

/tmp/<program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>

  生成的log文件如下圖所示:

??

  打開文件可以看到如下信息:

Log file created at: 2018/07/14 16:37:30
Running on machine: ROBO
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
I0714 16:37:30.196939 15848 consoleapplication1.cpp:14] Found 100 cookies

  上面介紹了日志輸出的格式和我們輸出的日志信息。glog擁有的4個日志等級:INFO,WARNING,ERROR,FATAL分別對應0,1,2,3。數值越大嚴重性越高,嚴重性高的日志不但會保存到自己的日志文件中,還會同時保存到所有比它嚴重性更低的日志文件中。例如ERROR信息會被同時打印到INFO,WARNING,ERROR日志文件中。添加如下測試代碼:

  LOG(INFO) << "google log first info level message!";LOG(WARNING) << "google log first warning level message!";LOG(ERROR) << "google log first error level message!";

  運行程序生成了三種日志文件:

// INFO
Log file created at: 2018/07/14 16:46:28 Running on machine: ROBO Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg I0714 16:46:28.779220 9736 consoleapplication1.cpp:14] google log first info level message! W0714 16:46:28.780218 9736 consoleapplication1.cpp:15] google log first warning level message! E0714 16:46:28.780218 9736 consoleapplication1.cpp:16] google log first error level message!// WARNING Log file created at: 2018/07/14 16:46:28 Running on machine: ROBO Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg W0714 16:46:28.780218 9736 consoleapplication1.cpp:15] google log first warning level message! E0714 16:46:28.780218 9736 consoleapplication1.cpp:16] google log first error level message!// ERROR Log file created at: 2018/07/14 16:46:28 Running on machine: ROBO Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg E0714 16:46:28.780218 9736 consoleapplication1.cpp:16] google log first error level message!

  同時注意控制臺輸出了錯誤信息(默認情況下ERROR和FATAL等級的信息會同時被輸出到stderr上):

?

  不同于log4系列的日志系統通過配置文件的方式,glog采用命令的方式來來配置參數,還可以直接在程序中指定。比如下面程序指定了輸出log的文件夾:

int main(int argc, char* argv[])
{string home = "./log/";  //要先創建此目錄,否則運行報錯.
  google::InitGoogleLogging(argv[0]);string info_log = home + "master_info_";google::SetLogDestination(google::INFO, info_log.c_str());string warning_log = home + "master_warning_";google::SetLogDestination(google::WARNING, warning_log.c_str());string error_log = home + "master_error_";google::SetLogDestination(google::ERROR, error_log.c_str());string fatal_log = home + "master_fatal_";google::SetLogDestination(google::FATAL, fatal_log.c_str());// You can specify one of the following severity levels (in increasing order of severity)LOG(INFO) << "info";LOG(WARNING) << "warning";LOG(ERROR) << "error";LOG(FATAL) << "fatal";   // Logging a FATAL message terminates the program (after the message is logged)!return 0;
}

  在Project目錄下(如果直接運行程序則在程序所在路徑下)創建log文件夾,運行程序生成的日志會輸出到該文件夾中:

  注意,打印FATAL消息會在打印完成后終止程序:

?

  glog提供了一些調試模式時輸出,release模式下不輸出的宏,如DLOG,DLOG_IF,DLOG_EVERY_N等。這些宏只有在debug模式下才會輸出日志,正常模式下不會輸出日志,也不會拖慢應用程序的速度。

  // 如果工程為Debug模式,下面信息會輸出,如果是release模式,下面信息不會輸出.DLOG(INFO) << "DLOG:Debug Mode Message!";

?  

  如果要自定義輸出log文件的格式,可修改源代碼logging.cc文件中相關的函數。

?

?

?

參考:

glog簡介

glog 入門教程

glog使用教程

Glog使用文檔

glog使用與功能修改

Google-glog 日志庫使用手記

在Windows上編譯、應用glog

Installing GLog on Windows

How To Use Google Logging Library (glog)

google/glog: C++ implementation of the Google logging module

轉載于:https://www.cnblogs.com/21207-iHome/p/9297329.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251256.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251256.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251256.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

javascript --- 異步工作流的動態排隊技術

很多情況下,使用async.series和async.paralle存在一個明顯的問題,即: 1.其任務隊列是靜態的,在其調用前,一定要明確任務隊列的數量,一旦明確了任務隊列的數量,就不能改變. 2.倘如要同時并發讀取上千個文件,使用async.paralle明顯不可能(各線程搶資源,根本不夠用),使用async.ser…

java中的內部類總結

內部類不是很好理解&#xff0c;但說白了其實也就是一個類中還包含著另外一個類 如同一個人是由大腦、肢體、器官等身體結果組成&#xff0c;而內部類相當于其中的某個器官之一&#xff0c;例如心臟&#xff1a;它也有自己的屬性和行為&#xff08;血液、跳動&#xff09; 顯然…

elementPlus關閉彈窗,頁面原先滾動條消失

一開始以為是彈窗內容超過一屏引起&#xff0c;改為一屏內也不能解決。 打開控制臺&#xff0c;發現彈窗后自動給body標簽加上了類el-popup-parent–hidden&#xff0c;關閉后也沒去除&#xff0c;因此手動刪除該類。 document.getElementsByTagName(body)[0].className ;

在Windows下如何創建虛擬環境(默認情況下)

很多小伙伴平時在使用Python的時候&#xff0c;有的項目需要使用Python2來進行開發&#xff0c;有的項目則是需要Python3來進行開發。當不清楚怎么分開環境的時候&#xff0c;此時兩個環境開始打架&#xff0c;彼此傻傻分不清楚。虛擬環境作為隔離的利器應運而生&#xff0c;其…

javascript --- 隱藏內部實現(最小暴露原則)

看下面的一個例子: function doSomething(a) {b a doSomethingElse( a * 2 );console.log( b * 3 ); }function doSomethingElse(a) {return a - 1; }var b;doSomething( 2 ) ; // 15上述代碼中的doSomethingElse實際上應該是doSomething的"私有"部分,根據最小暴露…

selenium python 入門-元素定位

環境搭建 安裝教程 http://www.testclass.net/selenium_python/install-selenium/ chrome瀏覽器 還需要下載chrome driver 把下載的chromedriver .exe放到chrome安裝目錄下的Application目錄下和 python所在的安裝目錄下&#xff0c;比如我的目錄是C:\Program Files (x86)\Goog…

ES5程序設計轉ES6 筆記

課程鏈接 1. 立即執行函數 特點&#xff1a;執行結束&#xff0c;立即銷毀&#xff1b;獨立作用域執行符號&#xff08;&#xff09;只能跟在表達式后面&#xff0c;不能放在函數聲明后分號可以寫在前面/后面document為傳入實參&#xff0c;doc為形參 ;(function(doc){...co…

DPDK helloworld 源碼閱讀

在 DPDK Programmers Guides 中的 EAL 一篇中有一個圖可以很清晰地看到一個DPDK的應用程序的大致執行思路&#xff1a; 初始化檢查CPU支持、微架構配置等完成后&#xff0c;執行main()函數。 第一步是 rte_eal_init()&#xff0c;核心初始化和啟動。其中線程使用的是pthread庫&…

javascript --- 作用域和閉包

執行環境: // 定義了變量或函數有權訪問的其他數據,決定了它們各自的行為 // 每個執行環境都有一個變量對象與之對應,執行環境中所定義的所有變量和函數都保存在變量對象中 // 某個執行環境中的所有代碼執行完畢后,該執行環境被銷毀,保存在其中的所有變量和函數定義也隨之銷毀…

異步下載圓形進度條顯示進度

圓形進度條參考鏈接即可&#xff1a;使用css3實現圓形進度條 需求點擊下載后遮罩層顯示下載進度&#xff1a; 1.圓形進度條參考以上鏈接&#xff0c;有點小瑕疵&#xff0c;可更改定位距離實現重合。 2.遮罩層&#xff1a; .lbOverlay{display: none;position: fixed;left: 0;…

javascript基本功

隱式類型轉換 var a {_default: 0,toString: function () {return a._default} } if (a 1 && a 2 && a 3) {console.log(解) } 訪問一個變量的時候進行攔截 var _default 0 Object.defineProperty(window, a, {get() {return _default} }) if (a 1 &am…

深信服筆試,抓兔子

*問題描述&#xff1a;抓兔子n個排成一排的洞&#xff0c;編號為1到n&#xff0c;兔子每天晚上會跳到相鄰的一個洞里&#xff0c;小q每天只能白天檢查其中的一個洞&#xff0c;小q會告訴你每天檢查的洞&#xff0c;分析是否一定能抓到兔子示例&#xff1a;3個洞&#xff0c;第一…

es6 --- 模塊

function foo(){var something cool;var another [1, 2, 3];function doSomething() {console.log( something );}function doAnother() {console.log( another.join( " ! " ) );} } // 是一個不明顯的閉包,doSomething()和doAnother()保持了foo的內部作用域接下來…

Java之遞歸遍歷目錄,修改指定文件的指定內容

EditProperties.java 1 package PropertiesOperation.Edit;2 3 import java.io.File;4 5 /**6 * 替換指定Porpoerties文件中的指定內容7 * 三個參數&#xff1a;8 * filePath&#xff1a;存放properties文件的目錄9 * srcStr&#xff1a;需要替換的字符串 10 * desStr&…

學習日志---7

1.復習Linux hadoop hdfs MapReduce基礎知識 1&#xff0c;列舉linux常用命令 shutdown now reboot mkdir mkdir -p touch filename rm -r filename rm -rf filename vi filename i--->可編輯狀態 esc --> : --->wq 保存退出 q! wq! cat grep find ifconfig ping user…

javascript --- 屬性描述符

從ES5開始,所有的屬性都具備了屬性描述符 var myObject {a: 2 };Object.getOwnPropertyDescriptor(myObject, "a"); //{ // value:2, // writable: true, // 可寫 // enumerable: true, // 可枚舉 // configurble: true // 可配置 //}定義屬性…

看了嗎網址鏈接

sklearn實戰-乳腺癌細胞數據挖掘&#xff08;博主親自錄制視頻&#xff09; https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare # -*- coding: utf-8 -*- ""&qu…

JMeter 性能測試進階實戰

課程簡介 本課程制作的主要目的是為了讓大家快速上手 JMeter&#xff0c;期間穿插了大量主流項目中用到的技術&#xff0c;以及結合當今主流微服務技術提供了測試 Dubbo 接口、Java 工程技術具體實施方案&#xff0c;注重實踐、注意引導測試思維、拒絕枯燥的知識點羅列、善于用…

javascript --- 混入

顯示混入: function mixin(sourceObj, targetObj){for(var key in sourceObj){ // 遍歷source中的所有屬性if(!(key in targetObj)) { // 找到targetz中沒有的屬性targetObj[key] sourceObj[key];}}return targetObj; }var Vehicle {engines: 1,iginition: function() {c…

php源碼代目錄

ext :存放動態和內建模塊的目錄&#xff0c;在這里可以找到所有的php官方虧站,并且也可以在這里編寫擴展&#xff1b; main:包含php的主要宏定義; pear: PHP擴展與應用庫; sapi:包含不同服務器抽象層的代碼; TSRM&#xff1a;Zend和PHP的"線程安全資源管理器"目錄; Z…