<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一文詳解 C++ 日志框架

          共 3962字,需瀏覽 8分鐘

           ·

          2020-10-19 13:00


          1

          日志框架


          ?日志框架



          一個經過專門設計的實用程序,用于規(guī)范應用程序的日志記錄過程。


          日志框架可以自己編寫(需要一定的能力哦),也可以由第三方(例如:log4cplus)提供。對于不同的日志框架,各自在實現方式上也有所不同。


          雖然可以簡單地“標準化”日志(例如:調用文件系統(tǒng) API,將信息寫入名為 log.txt 的文件),但是要成為一個嚴格意義上的框架,必須要超越標準化。也就是說,日志框架必須通過處理日志記錄來標準化解決方案,從而暴露一個標準的 API。


          沒明白?那就再具體一些,設想一個日志框架,封裝了三個主要部分:


          當想要捕獲程序的運行時信息時,首先要發(fā)出要記錄的信息。然后格式化這些信息,最后決定將它輸出到哪里。一般情況下,會輸出到文件中,但是也可以將其輸出到控制臺、數據庫,或者任何能夠接收數據的地方。


          如果有一系列代碼,能夠解決這些問題,那么就可以被看作是一個日志框架。



          2

          為什么不是 cout




          使用日志,只為成為更好的攻城獅。




          也許有人會問:既然 C++ 中有 cout,為什么還要使用日志呢?


          無法否認,在使用像 C++、Java、PHP 這樣的編程語言時,我們會經常將消息打印到控制臺,因為這是開發(fā)、測試和調試程序的一部分。但倘若我們正在處理一個服務端程序,卻無法看到其內部發(fā)生了什么,這時該怎么辦?唯一的可見性工具是日志文件,如果沒有日志,我們就不能進行任何調試,也無法知道程序內部在做什么。


          盡管 C++ 中有相當方便的 cout 輸出流,可以在控制臺上打印一些信息,或者可以通過其他方式將這些信息重定向到文件中,但這對于實際的應用程序來說根本不夠。尤其對于復雜的 C++ 程序來說,像 log4cplus 或任何其他日志框架能夠提供了更多的靈活性,而這是 cout 不可能完成的。


          在編寫代碼時,使用日志框架是一種很好的實踐。即使像《代碼整潔之道》這樣的書籍,也建議學習像 Log4 這樣的框架進行日志記錄。所以,應盡可能的在生產代碼中使用日志,而不是用 cout 來打印東西(這是不可接受的)。



          3

          使用日志的好處




          日志是一個優(yōu)秀系統(tǒng)不可或缺的組成部分。



          對于很多人來說,日志的作用僅限于調試。其實不然,它在很多方面都非常有用。



          日志是最好的診斷工具


          絕大多數人都曾面臨這樣的困境 - 一旦程序出現問題,很長時間都找不出原因!


          缺少日志,我們將不得不依賴于客戶或技術支持,讓他們描述在什么情況下發(fā)生了什么(很可能會存在一些誤導)。隨后我們需要通過開發(fā)環(huán)境重現問題,并進行各種調試,直至錯誤修復為止,然而這一般會耗費很長時間。但若有日志的幫助,我們便能迅速擺脫這種困境,可以很快地發(fā)現異常,并快速定位、解決問題!



          日志讓我們有機會監(jiān)測模塊的瓶頸


          隨著項目規(guī)模的增加,模塊會越來越多,調優(yōu)也變成了一場持久戰(zhàn)。


          通過記錄某些操作所花費的時間,我們可以及時地檢測模塊的瓶頸,并針對性地對一些耗時操作做出優(yōu)化。



          日志有助于我們了解用戶的行為


          為了提高產品質量,提供個性化服務,就必須了解用戶行為 - 他們做了什么,想要什么。


          要搞清楚這些,當然要有數據,所以需要采集和分析用戶的行為,而日志無疑是最主要的數據來源。



          4

          要不要重新發(fā)明輪子


          不要去重新發(fā)明輪子 - 《麥肯錫方法》



          既然已經對日志框架有了明確的了解,那么應該使用現有的日志框架,還是構建自己的日志框架呢?其實,這是一個老生常談的問題了 - 要不要重新發(fā)明輪子?引用莎士比亞戲劇《哈姆雷特》中的一句名言:


          To be or not to be - that is the question.


          現在我們正處于技術大爆發(fā)的時代,每一個技術領域中都有很多優(yōu)秀的解決方案。因此,自己完全不需要、也不應該去寫日志框架。就像不應該寫版本控制工具或 Bug 跟蹤管理工具一樣,其他人已經把這些東西搞出來了,而且搞的很好,Git、SVN,Bugzilla、Trac ...... 應有盡有,我們完全可以花很少的錢,甚至是免費使用它們。


          所以,請避免重復勞動,不要去重新發(fā)明輪子。應該堅持在自己的領域解決問題,將時間花在刀刃上。話雖如此,但我們還是需要了解關于輪子的一些細節(jié)(誰造的?怎么創(chuàng)造的?如何使用?),以從中接受靈感,并把自己的知識加進去。


          因此,當需要一個日志框架時,應該使用現有的框架,而不是去重新發(fā)明輪子。那么,問題來了,日志框架都有哪些呢?



          5

          日志框架都有哪些


          C++ 中的日志框架有很多,其中比較著名的有:


          • log4cxx:Java 社區(qū)著名的 Log4j 的 C++ 移植版,用于為 C++ 程序提供日志功能,以便開發(fā)者對目標程序進行調試和審計。

          • log4cplus:一個簡單易用的 C++ 日志記錄 API,它提供了對日志管理和配置的線程安全、靈活和任意粒度控制(也基于 Log4j)。

          • Log4cpp:一個 C++ 類庫,可以靈活地記錄到文件、syslog、IDSA 和其他目的地(也基于 Log4j)。

          • google-glog:一個 C++ 語言的應用級日志記錄框架,提供了 C++ 風格的流操作和各種輔助宏。

          • Pantheios:一個類型安全、高效、泛型和可擴展性的 C++ 日志 API 庫(號稱 C++ 領域速度最快的日志庫)。

          • POCO:還提供了一個?好的日志支持文檔。

          • ACE:ACE 也有日志支持。

          • Boost.Log:設計的非常模塊化,并且可擴展。

          • Easylogging++:輕量級高性能 C++ 日志庫(只有一個頭文件)。

          • G3log:一個開源、支持跨平臺的異步 C++ 日志框架,支持自定義日志格式。基于 g2log 構建,提升了性能,支持自定義格式。

          • Plog:可移植、簡單和可擴展的 C++ 日志庫。

          • spdlog:一個快速的 C++ 日志庫,只包含頭文件,兼容 C++11。

          • ……


          這么多框架,應該選擇哪一個呢?


          由于每個人的需求和技術棧都不一樣,所以很難直接回答這個問題,但是有一些選擇標準可供參考。



          6

          日志選擇標準



          易用性




          易于使用的框架,能讓你事半功倍。



          易用性,是優(yōu)秀框架的一個重要特性。所以無論使用什么框架,都應優(yōu)先考慮這一點。


          對于日志框架而言,一旦被選定,在后期開發(fā)過程中,項目組中的每個人都會頻繁使用。如果易用性不好的話,那絕對是一個噩夢!所以,在選擇日志框架時,應盡量找那些由簡單、直觀的 API 實現的方案。衡量標準可參考:對于缺乏經驗的團隊成員,應該在查看文檔和簡單示例之后,就能夠快速上手。



          性能(效率)




          功能決定當下,性能決定未來。



          另一個要考慮的重要因素是性能影響。正如上面提到的,我們會經常調用日志,這可能會對程序的性能產生巨大的影響。


          想象一下,一個日志框架,需要花費很長的時間才能啟動,在每次調用時阻塞并執(zhí)行文件 I/O,缺少緩沖機制……對于這樣的框架,你會用嗎?


          因此,在評估日志框架時,可以參考網上的一些文章來比較,也可以自己做一些比較性實驗(基準測試),例如:吞吐量 - 測量每秒可以完成多少次方法調用(越高越好);采樣 - 測量每次調用執(zhí)行究竟花費了多少時間(越低越好)。



          對現有代碼的影響




          影響越小,越容易維護。



          在以后的使用中,日志將無處不在。就像會影響運行時性能一樣,它們也會影響源碼的可維護性。


          從應用程序的角度來看,日志所處的位置比較尷尬。之所以這么說,是因為我們盡力隔離依賴性,提供良好的接口,并最小化耦合,在編程時考慮的是單一職責原則。然后日志出現了,它到處都是,與周圍的代碼無關。與這些優(yōu)秀的設計原則相比,日志顯得有些背道而馳。


          因此,應充分考慮所引入日志的影響范圍,盡量讓我們的代碼改動最小化!



          社區(qū)支持




          每一個成功框架的背后,都有一個偉大的社區(qū)。



          框架的生命力源于不斷地完善和發(fā)展,如果沒有強大的社區(qū)做支撐,這個框架便失去了源動力。


          因此,在選擇框架時,這一點非常重要 - 所選的框架是否有專門的團隊做支撐?在像 Stack Overflow 這樣的問答網站上,它是否有很強的存在感?確保一點,如果在使用過程中遇到了問題,你能有辦法快速解決。倘若選擇了一個不知名的框架,當遇到了 Bug 時,那么可能會浪費大量的時間來解決問題。



          完整性




          完整的框架,鑄就完美的生產力。



          在最前面,我們將日志的功能分為三個主要部分:日志記錄、格式化和輸出地,所以要確保所選的日志框架徹底解決了這些問題。


          日志記錄和輸出地比較基礎,幾乎所有日志框架都有這些概念。話雖如此,但對于好的框架來說,應該巧妙地將日志記錄與輸出地分開,并且還應該有多種可選的輸出地。在理想情況下,最好能夠自定義輸出地。


          一般情況下,格式化日志文件會整齊地排列,并具有很好的可讀性。但在 DevOps 的世界里,這些遠遠不夠。具體來說,日志文件需要被格式化為可解析的數據。通過將日志輸出作為數據處理,可以很容易地聚合、搜索和可視化日志,從而能夠在生產支持方面助你一臂之力。所以,要確保日志框架擁有這種能力。



          發(fā)展前景




          只有前途光明,方能大行其道。



          無法繞過這一點 - 在選擇日志框架時,不僅要考慮它的現狀,還應該注重它的發(fā)展前景。


          像上面提到的 C++ 日志框架,每一個都非常優(yōu)秀且特點鮮明。但有一些卻獲得了更多的關注度,例如 log4cplus、glog,為什么如此呢?因為它們有很強大的“基因”和“后臺”,一個是著名的 Log4j 的衍生品,另一個則是 Google 的“親兒子”。


          一個框架的發(fā)展前景,取決于眾多因素 - 關注度、用戶基數、社區(qū)活躍度 …… 要想大行其道,這些幾乎都不能少。


          ·END·


          瀏覽 64
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人影片大香蕉 | 豆花视频在线看一区二区 | 激情乱伦视频网 | 就要撸在线视频 | 日韩熟悉30p |