2016-07-27 19 views
1

我使用自定义的boost::log格式彩色编码输出日志消息,但我没能找到合适的方式来增加时间戳线程ID属性到日志中。当我使用文件日志记录时,我只写keywords::format = "[%TimeStamp%] [%ThreadID%] [%Severity%]: %Message%"作为logging::add_file_log参数。我想有以下自定义格式类似的效果:如何使用自定义boost :: log格式化程序输出TimeStamp和ThreadID属性?

void coloring_formatter(const logging::record_view& record, 
         logging::formatting_ostream& stream) 
{ 
    auto severity = record[logging::trivial::severity]; 
    assert(severity); 

    stream << "\e[1m"; 

    switch (severity.get()) 
    { 
    case logging::trivial::severity_level::trace: 
    stream << "\e[97m"; 
    break; 
    case logging::trivial::severity_level::debug: 
    stream << "\e[34m"; 
    break; 
    case logging::trivial::severity_level::info: 
    stream << "\e[32m"; 
    break; 
    case logging::trivial::severity_level::warning: 
    stream << "\e[93m"; 
    break; 
    case logging::trivial::severity_level::error: 
    stream << "\e[91m"; 
    break; 
    case logging::trivial::severity_level::fatal: 
    stream << "\e[41m"; 
    break; 
    } 

    stream // << output TimeStamp 
     // << output ThreadID 
     << "[" << severity << "] " 
     << record[logging::expressions::smessage] 
     << "\e[0m"; 
} 

回答

3

既然你已经添加了这些属性,日志记录,有多种方法来提取它们。最简单的方法是使用keywords。首先声明属性的关键字:

BOOST_LOG_ATTRIBUTE_KEYWORD(a_timestamp, "TimeStamp", attrs::local_clock::value_type) 
BOOST_LOG_ATTRIBUTE_KEYWORD(a_thread_id, "ThreadID", attrs::current_thread_id::value_type) 

请注意,第三个参数是相应属性的值类型。在这个例子中,我假设你使用的属性是local_clockcurrent_thread_id

现在您可以使用这些关键字从日志记录中提取值。

stream << record[a_timestamp] << " " 
     << record[a_thread_id] 
     << " [" << severity << "] " 
     << record[logging::expressions::smessage] 
     << "\e[0m"; 
相关问题