2015-08-25 186 views
0

的互動我有一個很好的格式和控制檯日誌:升壓日誌:日誌設置文件和代碼配置

auto fmtStream = expressions::stream 
    << "LineID: " << expressions::attr<unsigned int>("LineID") << " " 
    << "Message: " << expressions::message: 

boost::log::add_console_log(std::cout, keywords::format = fmtStream); 

格式流當然是稍微更長.. 現在我想給用戶配置日誌:

std::ifstream file("log.conf"); 
init_from_stream(file); 

很多fmtStream格式化使用的是無法使用的配置文件中的格式字符串。

我該如何給用戶修改控制檯接收器的可能性,例如:添加一個過濾器?但我想保留格式字符串作爲默認值。

可能性我看看它:

1)給我在我的代碼名稱定義控制檯日誌。用戶現在可以使用同名的接收器對其進行修改。

2)設置所有接收器的默認格式。但根據Boost Log changing the default logging::core formatter?這是不可能的。

3)有沒有其他想法?

謝謝!

回答

2

init_from_streaminit_from_settings函數將根據設置中的指定初始化庫。這些功能旨在從零開始配置庫,因此它們將添加具有指定設置的新接收器,包括過濾器和格式器。如果您只需要爲現有接收器自定義格式化程序並且不允許完整的日誌記錄配置,那麼您應該自己解釋設置文件。

您可以使用parse_settings函數解析設置文件。從它您將收到settings(或wsettings)對象,您可以分析和修改herehere(對於參考文檔中的錯誤格式感到抱歉)可以進行分析和修改。由於您可能不打算支持Boost.Log支持的所有接收器和參數,因此您不受Boost.Log放入參數中的語義限制,並且可以用任何您想要的方式解釋設置。例如,您可以選擇只讀水槽格式:

boost::log::settings setts = boost::log::parse_settings(file); 
if (boost::optional<std::string> fmt = setts["MySink"]["Format"]) 
{ 
    // Sink format is specified in the setting file 
} 

現在,把這個格式字符串成格式化,你將需要parse_formatter功能(字符串格式描述here)。此函數返回一個格式化程序對象,您可以將其安裝到接收器中,前提是您保存了一個指針。

auto sink = boost::log::add_console_log(std::cout, keywords::format = fmtStream); 
boost::log::settings setts = boost::log::parse_settings(file); 
if (boost::optional<std::string> fmt = setts["MySink"]["Format"]) 
{ 
    sink->set_formatter(boost::log::parse_formatter(fmt.get())); 
} 

還有一件事要記住。例如,如果在格式化程序中使用自定義類型的屬性值(例如嚴重性的枚舉),則必須在分析格式化程序之前在庫中註冊這些類型。這樣解析器將能夠創建一個知道你的類型並使用適當的格式化操作符的格式化器。有一個tutorial描述如何做到這一點。