C++的開源跨平台日志庫glog學習研究(一)


作為C++領域中為數不多的好用、高效的、跨平台的日志工具,Google的開源日志庫glog也算是鳳毛麟角了。glog 是一個C++實現的應用級日志記錄框架,提供了C++風格的流操作。

恰巧趁着五一我也學習研究了這個glog庫,寫個總結如下。走過路過的的各位牛人、高手可以忽略這篇文章了。

從code.google.com下載源碼(在這里),在Visual Studio 2010中打開工程,如下:

                 

可見只有四個工程,其中libglog和libglog_static分別是Windows下的動態庫和靜態庫,其實代碼都是一樣的,另外兩個工程分別是測試工程(也是同一套代碼),看名字都就知道了。

glog實現代碼並不多,代碼量統計如下:

                 

從上面看出真正有效的C/C++代碼也就8000行以內吧。

直接編譯,注意,竟然不能編譯通過!!!我這里下載的是SVN 地址http://google-glog.googlecode.com/svn/trunk/上的r142版本,從編譯錯誤可以找到原因,簡單修改即可全部編譯成功,就是將文件logging.cc中的第183、189、199、205行的ssize_t改為size_t,如下:

                 

實在不明白為什么還有這種情況發生,難道不應該至少保證編譯沒問題才會commit代碼的么。而直接下載的穩定版(glog-0.3.3.tar.gz )則沒有這個問題,看來開發版本都是不可靠的啊。

把所有代碼從每個文件的代碼量和實現復雜度做一個整體分析。

按代碼行數排序:

                 

按復雜度排序(復雜度定義在不同工具中有不同表示,這里僅作參考):

                 

從這里也基本能看出重要的文件或函數實現了。另外按復雜度排序是排名第一的文件叫做demangle.cc,你在VS工程里並沒有發現有這個cc,甚至都沒有include相應的demangle.h,這個文件是干嘛的?隨后再作分析(其實單看文件名就基本能猜到了)。

其中logging.cc是主要的功能實現,對該文件的分析如下:

                 

logging.cc中函數復雜度如下:

                

當然,不同人使用不同的分析工具,導致上面的結果會有一定的差異,仍以logging.cc為例,使用另外工具分析函數復雜度部分結果如下:

                

注意函數LogFileObject::Write和TruncateLogFile的復雜度排序計算值和排序順序都不相同,但總體上來說都算是正常的,也算是都能管中窺豹吧。

有了這些簡單的統計分析,接下來瀏覽代碼就相對有方向性了,不過話說這個代碼量總體來說也不多。像該代碼中使用了大量的宏技巧,初看還是不好理解的,接下來會從代碼上做點分析理解。

 

一直沒有介紹glog,但是,如果你了解glog,那你肯定知道些什么了。最后把glog的特性或者說功能簡單摘抄如下(處處都有,不顯示引用原作了):

  1. 參數設置,以命令行參數的方式設置標志參數來控制日志記錄行為;
  2. 嚴重性分級,根據日志嚴重性分級記錄日志;
  3. 可有條件地記錄日志信息;
  4. 條件中止程序。豐富的條件判定宏,可預設程序終止條件;
  5. 異常信號處理。程序異常情況,可自定義異常處理過程;
  6. 支持debug功能。可只用於debug模式;
  7. 自定義日志信息;
  8. 線程安全日志記錄方式;
  9. 系統級日志記錄;
  10. google perror風格日志信息;
  11. 精簡日志字符串信息。

好吧這里還是給出我引用的文章:   

http://google-glog.googlecode.com/svn/trunk/doc/glog.html#verbose

http://mengjh.blog.51cto.com/2860827/546766

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM