Как вывести атрибуты TimeStamp и ThreadID с помощью пользовательского boost::log formatter?

Я использую пользовательский boost:: log formatter для цветового кодирования выходного сообщения журнала, но мне не удается найти правильный способ добавления атрибутов TimeStamp и ThreadID в журнал. Когда я использую ведение журнала файлов, я просто пишу keywords::format = "[%TimeStamp%] [%ThreadID%] [%Severity%]: %Message%" как logging::add_file_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";
}

1 ответ

Решение

Учитывая, что вы добавили эти атрибуты в записи журнала, существует несколько способов их извлечения. Самый простой способ - использовать ключевые слова. Сначала вы объявляете ключевые слова для атрибутов:

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";
Другие вопросы по тегам