Код, который вы представили, является неполным.В выражении форматера severity
должно быть ключевым словом атрибута , чтобы извлечь уровни серьезности из записей журнала.Не ясно, что это в вашем случае, я подозреваю, что это может быть константа, которая выводится в поток независимо от фактического уровня серьезности, прикрепленной к записям журнала.
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
для форматирования отметки времени.