1. 程式人生 > >boost.log 架構研究和主要使用總結

boost.log 架構研究和主要使用總結

前面做了不少boost log的例子,現在來總結一下,下面是boost log庫的架構圖:

 下面總結一下和這個架構相關的知識:

1. 如何獲得Logging core

#include 
...
boost::shared_ptr core = logging::core::get();

2. 如何安裝Sink物件

一個core可以安裝多個Sink,下面的程式碼假定已經有了兩個Sink物件,將其安裝到core中

core->add_sink(sink1);
...
  core->add_sink(sink2);

3. 如何建立一個Sink物件

需要先建立一個backend物件,然後在建立sink物件的時候,將backend物件傳遞給它。

typedef sinks::synchronous_sink TextSink;
  // init sink1
  boost::shared_ptr backend1 = boost::make_shared(
  keywords::file_name = "sign_%Y-%m-%d_%H-%M-%S.%N.log",
  keywords::rotation_size = 10 * 1024 * 1024,
  keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0),
  keywords::min_free_space
= 30 * 1024 * 1024); boost::shared_ptr sink1(new TextSink(backend1));

4. 如何建立一個backend物件

指定frontend型別

前面的程式碼中已經演示,注意backend的型別需要制定一個frontend型別作為其模板類。因此,當建立一個backend物件的時候,已經確定了frontend。

這個frontend模板可以用synchronous_sink類,也可以用asynchronous_sink, 後者不會阻塞呼叫程式,會額外的建立執行緒去處理log,不過會慢點,記憶體消耗大點。一般都推薦先用後者。

用keywords構造引數

這裡看到一個概念:keywords. 在boost/log/keywords/目錄下27個hpp檔案:

auto_flush.hpp  facility.hpp   ident.hpp       log_source.hpp      open_mode.hpp        rotation_size.hpp  target.hpp
channel.hpp     file_name.hpp  ip_version.hpp  max_size.hpp        order.hpp            scan_method.hpp    time_based_rotation.hpp
delimiter.hpp   filter.hpp     iteration.hpp   message_file.hpp    ordering_window.hpp  severity.hpp       use_impl.hpp
depth.hpp       format.hpp     log_name.hpp    min_free_space.hpp  registration.hpp     start_thread.hpp
keywords是boost庫的基本概念,設計到一個巨集BOOST_PARAMETER_KEYWORD,定義在boost/parameter/keywords.hpp檔案中, 主要作用就是在指定的namespace中建立一個singleton的物件。所以上面的幾行keywords:: 程式碼就是給keywords namespace下面的幾個singleton物件file_name, rotation, time_based_rotation和min_free_space賦值。關鍵是要看看下面這個類的建構函式如何使用這些keywords.
sinks::text_file_backend

參考文件:

注意,text_file_backend的建構函式語法上支援變參,但是語義上只支援有限的keywords:

template< typename ArgsT >
    void construct(ArgsT const& args)
    {
        construct(
            filesystem::path(args[keywords::file_name | filesystem::path()]),
            args[keywords::open_mode | (std::ios_base::trunc | std::ios_base::out)],
            args[keywords::rotation_size | (std::numeric_limits< uintmax_t >::max)()],
            args[keywords::time_based_rotation | time_based_rotation_predicate()],
            args[keywords::auto_flush | false]);
    }
文件中也的確如此描述。但是在text_file_backend.hpp檔案中發現還是有關於min_free_space的程式碼:
namespace aux {

    //! Creates and returns a file collector with the specified parameters
    BOOST_LOG_API shared_ptr< collector > make_collector(
        filesystem::path const& target_dir,
        uintmax_t max_size,
        uintmax_t min_free_space
    );
    template< typename ArgsT >
    inline shared_ptr< collector > make_collector(ArgsT const& args)
    {
        return aux::make_collector(
            filesystem::path(args[keywords::target]),
            args[keywords::max_size | (std::numeric_limits< uintmax_t >::max)()],
            args[keywords::min_free_space | static_cast< uintmax_t >(0)]);
    }

} // namespace aux
所以估計還是可以使用target, max_size 和 min_free_space這些keywords. 以後試了就知道了。

5. 如何在sink中指定格式

下面到了指定日誌格式,這個需要在sink中指定,比如:

sink1->set_formatter (
expr::format("[%1%]<%2%>(%3%): %4%")
% expr::format_date_time< boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S")
% expr::attr("Severity")
% expr::attr("ThreadID")
% expr::smessage
);
這裡的關鍵是理解expr::format. 文件在這裡:http://www.boost.org/doc/libs/1_55_0/libs/log/doc/html/log/detailed/expressions.html#log.detailed.expressions.formatters

我使用的是Boost::Format風格。

相關推薦

boost.log 架構研究主要使用總結

前面做了不少boost log的例子,現在來總結一下,下面是boost log庫的架構圖:  下面總結一下和這個架構相關的知識: 1. 如何獲得Logging core #include ... boost::shared_ptr core = logging:

boost log庫使用 十二 架構研究主要使用總結

架構下面是boost log庫的架構圖:簡單使用 下面總結一下和這個架構相關的知識:如何獲得Logging core#include <boost/log/core.hpp> ... boost::shared_ptr<logging::core> c

boost log -- 使用心得碰到的那些坑(一)

最近研究了一下boost::log這個庫,記錄一下心路歷程 我的需求是log功能儘可能的不消耗程式時間,列印到stdout, log需要提供如下資訊:時間,執行緒ID,程序名字,日誌等級,檔案及行號 我的測試環境 boost 1.67 gcc version

boost log -- 使用心得碰到的那些坑(二)

前一篇文章boost log – 使用心得和碰到的那些坑(一) 寫了如何使用boost;;log, 這篇文章主要寫寫怎樣用boost;;log構建一個工程,目的就是讓使用者使用時忘掉log細節。 專案依賴 boost c++11 cmake 設計 為了以後擴充套

門戶級UGC系統的技術進化路線——新浪新聞評論系統的架構演進經驗總結

http://www.csdn.net/article/2014-12-17/2823183 評論系統,或者稱為跟帖、留言板,是所有入口網站的核心標準服務元件之一。與論壇、部落格等其他網際網路UGC系統相比,評論系統雖然從產品功能角度衡量相對簡單,但因為需要能夠在突發熱

企業架構研究總結(6)——聯邦企業架構之FEAF的出現構成(上)

      美國聯邦政府可以說是企業架構應用的先行者和最大倡導者。通過企業架構的發展歷史我們可以看出,早在上世紀九十年代以來,美國軍方就對這種全域性性的資訊共享的理論開始了研究,並開發出符合其特色企業架構框架理論(DoDAF)。除此之外,在Zachman框架引入到美國聯邦政府

數據中心架構ToREoR【總結

需要 lan des blog 從服務器 總結 業務 解決 tor 1、前言   最近在看《雲數據中心網絡技術》,學習了企業數據中心網絡建設過程,看到有ToR和EoR兩種布線方式,之前沒有接觸過,今天總結一下。 2、布線方式 ToR:(Top of Rack)接入方式

企業架構研究總結(3)——企業架構的發展歷程

學習任何一項理論,我認為最好的入門方式就是探究其歷史根源以及發展程序,藉此闡明該理論產生的真實原因,避免讀者一開始陷入各種理論所共有的晦澀之漩渦而不能自拔,最終連為什麼而學都理不清楚。學習企業架構和企業架構框架理論亦然。企業架構是自上個世紀七、八十年代發展起來的一套理論,在這

企業架構研究總結(4)——企業架構與企業架構框架概論

      通過企業架構的發展歷程我們可以看出,經過幾十年的發展業界已經湧現出了很多企業架構以及企業架構框架理論。在本章中,筆者將挑選幾種主要的企業架構和企業架構框架理論進行詳細闡述。需要注意的是,雖然本章定名為“企業架構與企業架構框架”,但是由於企業架構的特性所致,其真實形

企業架構研究總結(8)——聯邦企業架構之CIO委員會的企業架構實施指南(上)

企業生命週期       FEAF為聯邦企業架構的建設提供了方法論,但是該框架還只是在概念層面提出了聯邦企業架構建設過程的各組成部分以及他們之間的關係,而對於如何以步進式的方式建設企業架構,FEAF的詳細程度還是不夠的。那麼該如何使用架構框架理論為聯邦政府以及各個機構建設企

企業架構研究總結(9)——聯邦企業架構之CIO委員會的企業架構實施指南(下)

開發基線企業架構       在開發基線企業架構這一過程中,各個企業或組織需要根據已經確定的架構目標、範圍和所採用的架構框架對當前自身的狀態進行各種製品的開發,這既包括針對核心架構製品的開發,也包括對支援性架構製品的開發,同時還包括針對其他由於特定需求而單獨定義的架構製品(

企業架構研究總結(13)——聯邦企業架構之FEA及參考模型(下)

      資料參考模型DRM       資料參考模型的目標是通過標準的資料描述、通用資料的發現以及統一的資料管理實踐的推廣使得聯邦政府實現跨機構的資訊共享和重用。資料參考模型的適用範圍很廣,它可以用在一個機構內部,也可以用在某一個利益共同體(COI,Community

企業架構研究總結(19)——TOGAF架構開發方法(ADM)之準備階段

1.1 準備階段(Preliminary) 企業架構開發方法各階段——預備階段 1.1.1 目標       預備階段的目標是: 對進行企業架構活動的組織的背景和環境進行審查。 明確企業架構的贊助人,以及其他將被建立企業架構這項業務指令所影響的主要干係人,並確定

企業架構研究總結(21)——TOGAF架構開發方法(ADM)之業務架構階段

1.3 業務架構(Business Architecture) 企業架構開發方法各階段——業務架構 1.3.1 目標 描述基線業務架構 開發基於原則、業務目標和策略驅動力的目標業務架構,描述產品和/或服務策略,以及業務環境在組織、功能、過程、資訊和地理這些方面

資料中心架構ToREoR【總結

1、前言   最近在看《雲資料中心網路技術》,學習了企業資料中心網路建設過程,看到有ToR和EoR兩種佈線方式,之前沒有接觸過,今天總結一下。 2、佈線方式 ToR:(Top of Rack)接入方式就是在伺服器機櫃的最上面安裝接入交換機。 EoR:(End of Row)接入交換機集中安裝在一列

【 專欄 】- Android系統開發架構研究

Android系統開發和架構研究 在這個專欄,我會分享Android系統開發實踐中的心得體會,對系統架構實現演變的理解, 特別是Android framework,native 和 kernel的相關研究。我也會收集我看到他人的優

原生js的一些研究總結(1)

資料型別 基本型別值包括: undefined,null,Boolean,Number和String,這些型別分別在記憶體中佔有固定的大小空間,它們的值儲存在棧空間,我們通過按值來訪問的。 引用型別包括:物件、陣列、函式等。 對於引用型別的值,則必須在堆記

基於Spring BootSpring Cloud實現微服務架構學習(五)-Docker總結

介紹 Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。 Docker在部署軟體方面解決了最困難的問題,將應用程式程式

Hadoop 2.6 日誌檔案MapReduce的log檔案研究心得

學習演練Hadoop 2.6有一段日子了。現在才大致搞清楚了系統裡面各個log的位置和功能,在這裡總結一下。網上的資料並不豐富,甚至Google出來的結果也不是很滿意,或許這個是太簡單了,牛人都不屑來寫。也可能是各個公司藏著掖著的東西。 Hadoop 2.6包含兩個大部分:

架構設計技術選型的思路總結

本文僅給出架構設計時需要考慮的知識點,並不會對具體知識點做詳細介紹。 一、頂層架構 Linux/Windows平臺、CS/BS架構、大資料架構、應用領域(遊戲、網際網路、傳統行業等) 二、CS中的Client的技術選型 1、GUI開發技術 (1)微軟技