2016-07-27 4 views
1

Я использую пользовательский boost::log форматировщик для цветного кодирования сообщения вывода журнала, но я не в состоянии найти правильный способ добавить TimeStamp и ThreadId атрибутов в журнал. Когда я использую регистрацию файлов, я просто пишу keywords::format = "[%TimeStamp%] [%ThreadID%] [%Severity%]: %Message%" как параметр logging::add_file_log. Я хочу иметь аналогичный эффект в следующем пользовательском форматировщике:Как вывести атрибуты TimeStamp и ThreadID с настраиваемым форматированием boost :: log?

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_clock и current_thread_id.

Теперь вы можете использовать эти ключевые слова для извлечения значения из записей журнала.

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