Как использовать метку времени и строку строгости? - PullRequest
1 голос
/ 16 мая 2019
  1. Я использовал официальный код для форматирования приемника, который завершился
    sink.set_formatter    (
        expr::stream
        << "[ "
        << expr::format_date_time<boost::posix_time::ptime>("TimeStamp","%H:%M:%S.%f")
        << " - " << severity << " ] "
        << expr::smessage
    )

Но выход составляет [%time% - 1 ] %message%. И severity просто выводится как int

Но я хотел получить результат [%time% - debug ] %message%.

Я использовал severity_logger_mt<SeverityLevel> с Severity просто перечислением


  1. Я попытался преобразовать Severity сам, предоставив функцию sink :: set_formatter, скомпилированные ошибки и выходные данные показаны в коде:
void coloring_formatter(const boost::log::record_view& record,
                            boost::log::formatting_ostream& stream)
{

  stream << "["
    /* !!! ERROR !!! with no acceptable convertor for <<   */
    << record[timestamp]    

   /*!!! compile ERROR !!! no matching function call for format_date_time */
   << expr::format_date_time<
                    boost::posix_time::ptime>(timestamp, "%Y-%m-%d %H:%M:%S")

   /*!!! complied done but with no time stamp output !!!  */
<< boost::log::expressions::format_date_time<
                    boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S")
             << " - " << type << "] "
             << record[boost::log::expressions::smessage];
    }

Может ли кто-нибудь помочь мне с

  1. правый вывод "метки времени" в функции sink::set_formatter

  2. строка вывода Severity вместо int

1 Ответ

1 голос
/ 17 мая 2019
  1. Код, который вы представили, является неполным.В выражении форматера severity должно быть ключевым словом атрибута , чтобы извлечь уровни серьезности из записей журнала.Не ясно, что это в вашем случае, я подозреваю, что это может быть константа, которая выводится в поток независимо от фактического уровня серьезности, прикрепленной к записям журнала.

  2. The *Функция 1010 * неверна, поскольку она пытается использовать лямбда-выражения форматера подобно expr::format_date_time с реальным потоком.

Вы должны понимать разницу между лямбда-выражение aka ленивое выражение (которое создает функцию для последующего вызова; когда эта функция вызывается с потоком, она выполняет форматирование) и фактическое выражение для потоковой передачи, которое создаетвывод в потоке, как он выполняется.expr::format_date_time и другие компоненты из пространства имен boost::log::expressions используются для составления лямбда-выражений для фильтров и форматеров.Они не могут использоваться в реальных выражениях вывода потока.

Когда вы вызываете sink.set_formatter, вы должны предоставить функцию, которая будет выполнять форматирование записи журнала при вызове.Есть несколько способов описать эту функцию.Одним из способов является использование лямбда-выражения, как в вашем случае # 1, начиная с expr::stream или expr::format.Другой способ - написать функцию с нуля, как в вашем случае №2, но в этой функции вы больше не можете использовать лямбда-выражения.

Вы можете увидеть примеры Boost.Log (например, здесь, здесь или здесь ) для форматирования даты / времени и уровней серьезности.Важные части, на которые следует обратить внимание в этих примерах:

  • Для типа уровня серьезности есть operator<<, который выполняет преобразование из перечисления в строку.Этот оператор должен находиться в том же пространстве имен, что и перечисление, иначе компилятор не найдет его и выведет перечисление в виде целого числа.
  • Перечисление уровня серьезности должно использоваться в типе регистратора в качестве параметра шаблона,Таким образом, вы гарантируете, что записи журнала будут иметь уровни серьезности с типом перечисления.
  • Перечисление уровня серьезности должно использоваться в модуле форматирования, где вы указываете уровень серьезности.Когда вы используете expr::attr, оно должно быть в параметре шаблона, когда вы используете ключевое слово, оно должно быть частью определения ключевого слова с BOOST_LOG_ATTRIBUTE_KEYWORD.Это гарантирует, что средство форматирования может извлечь ваше перечисление из записи журнала при вызове средства форматирования.
  • При форматировании даты / времени expr::format_date_time можно использовать только в лямбда-выражении.Когда вы пишете свою функцию форматирования с нуля, вы должны использовать Boost.DateTime или такие функции, как strftime для форматирования отметки времени.
...