2017-01-25 42 views
1

我試圖格式化升壓日誌輸出,使得選擇的字段將始終爲輸出日誌對齊原因的特定寬度。C++ boost日誌位置(索引)格式對齊

add_file_log(
     keywords::file_name = s.str(), 
     keywords::rotation_size = log_info.log_file_size, 
     keywords::max_size = log_info.log_file_amount * log_info.log_file_size, 
     keywords::target = log_info.log_path, 
     keywords::open_mode = std::ios::out | std::ios::app, 
     keywords::auto_flush = true, 
     keywords::format = 
     expressions::format("[%1%] [%2%] [%3%] [%4%] %5%") 
     % expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S.%f") 
     % expressions::attr<unsigned int>("ThreadID") 
     % expressions::attr<string>("Scope") 
     % trivial::severity 
     % expressions::smessage 
    ); 

我已經嘗試不同的格式,如

  • 「[%1%] [%2%] [%3%] [%|20噸|%4%]%5%」
  • 「[%1%] [%2%] [%3%] [%-20s]%5%」
  • 瑣碎::嚴重性< <的std ::運輸及工務局局長(20)

我的許多嘗試都拋出了以下錯誤:

> Caught Exception in cyacollector main. Error: Unsupported format 
> placeholder 

回答

1

目前,在Boost.Log中expressions::format僅支持%N%形式的位置佔位符。這種格式不允許其他參數,例如寬度或精度。大多數情況下,這是因爲此格式化程序已將格式化的字符串插入到格式模板中,因此大多數參數都無法在此處應用。

但是,您可以通過修改參數爲format來達到您想要的效果。您可以使用max_size_decor裝飾器和std::setw操縱器的組合來實現日誌輸出中每個列的固定寬度的效果。

add_file_log(
    ..., 
    keywords::format = 
    expressions::format("[%1%] [%2%] [%3%] [%4%] %5%") 
     % expressions::max_size_decor<char>(30)[ expressions::stream << std::setw(30) << expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S.%f") ] 
     % expressions::max_size_decor<char>(10)[ expressions::stream << std::setw(10) << expressions::attr<unsigned int>("ThreadID") ] 
     % expressions::max_size_decor<char>(20)[ expressions::stream << std::setw(20) << expressions::attr<string>("Scope") ] 
     % expressions::max_size_decor<char>(5)[ expressions::stream << std::setw(5) << trivial::severity ] 
     % expressions::smessage 
);