2016-09-13 111 views
0

如果日誌消息太長(例如1000個字符),boost::log是否有可能只考慮日誌消息的一部分?這在跟蹤變量內容時非常有用,其中整個變量不是強制性的,無法找出所需的信息。提升日誌消減長日誌消息

例如:當從當前目錄打印包含文件列表的字符串時,我不需要查看整個列表就可以知道文件系統是否成功掃描。

boost::log::add_file_log 
(
    boost::log::keywords::file_name = "logs/Log_%Y-%m-%d_%H-%M-%S.log", 
    boost::log::keywords::rotation_size = 10 * 1024 * 1024, 
    boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), 
    boost::log::keywords::auto_flush = true, 
    boost::log::keywords::format = 
    (
     boost::log::expressions::stream 
     << boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S:%f") 
     << " [" << boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID") << "]" 
     << ": <" << boost::log::trivial::severity << "> " 
     << boost::log::expressions::smessage 
    ) 
); 

例如爲:可boost::log::expressions::smessage定製像boost::log::expressions::smessage::substr(0, 1000)或以任何其他方式?

回答

2

由於升壓1.62有一個max_size_decor裝飾,可以做你想問什麼。您可以這樣使用它:

boost::log::add_file_log 
(
    boost::log::keywords::file_name = "logs/Log_%Y-%m-%d_%H-%M-%S.log", 
    boost::log::keywords::rotation_size = 10 * 1024 * 1024, 
    boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), 
    boost::log::keywords::auto_flush = true, 
    boost::log::keywords::format = 
    (
     boost::log::expressions::stream 
     << boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S:%f") 
     << " [" << boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID") << "]" 
     << ": <" << boost::log::trivial::severity << "> " 
     << boost::log::expressions::max_size_decor(1000) 
     [ 
      boost::log::expressions::stream << boost::log::expressions::smessage 
     ] 
    ) 
); 

裝飾器將採用的格式化程序的輸出限制爲指定的字符數。

您也可以創建自己的格式化程序。有this回答描述多種方式做到這一點。例如,你可以使用boost::phoenix::bind來包裝你的函數,會做的大小限制:

boost::string_view limit_size(boost::log::value_ref< 
    std::string, boost::log::expressions::tag::smessage > const& message) 
{ 
    if (!message) 
    { 
     // No message attribute in the log record 
     return boost::string_view(); 
    } 

    boost::string_view msg = message.get(); 
    return msg.substr(0, 1000); 
} 

boost::log::add_file_log 
(
    boost::log::keywords::file_name = "logs/Log_%Y-%m-%d_%H-%M-%S.log", 
    boost::log::keywords::rotation_size = 10 * 1024 * 1024, 
    boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), 
    boost::log::keywords::auto_flush = true, 
    boost::log::keywords::format = 
    (
     boost::log::expressions::stream 
     << boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S:%f") 
     << " [" << boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID") << "]" 
     << ": <" << boost::log::trivial::severity << "> " 
     << boost::phoenix::bind(&limit_size, boost::log::expressions::smessage.or_none()) 
    ) 
); 

在這個例子中,phoenix::bind創建提取消息的包裝函數對象從日誌記錄屬性值,並將其傳遞到您的limit_size函數包裝在value_ref引用包裝中。如果日誌記錄不包含消息,則引用包裝器爲空(這就是or_none所做的)。不管limit_size返回將作爲格式化過程的一部分輸出到流中。在這種情況下,您可以使用boost::string_viewboost::string_ref來避免複製字符串。