Boost Log 1.62: условие фильтра должно быть в скобках? - PullRequest
0 голосов
/ 07 ноября 2018

Я работаю с библиотекой Boost Log в Ubuntu 14.04 и Ubuntu 18.04. 14.04 я использую libboost-log1.54, а 18.04 я использую libboost-log1.62.

Я использую следующий пример кода (называемый main.cpp):

#include <boost/log/utility/setup.hpp>

int main(int argc, char * argv[])
{
  boost::log::settings s;
  s["Core"]["DisableLogging"] = false;
  s["Sinks.File.Destination"] = "TextFile";
  s["Sinks.File.FileName"] = "test.log";
  s["Sinks.File.Filter"] = "not %Channel% matches Something";

  boost::log::init_from_settings(s);

  return 0;
}

Я использую эту команду для построения кода:

g++ main.cpp -DBOOST_LOG_DYN_LINK -lboost_log_setup -lboost_system

Код может быть успешно собран как 14.04, так и 18.04. Однако, когда я запустил исполняемый файл, файл 18.04 выдал исключение:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::log::v2_mt_posix::parse_error> >'
  what():  Invalid filter definition: unexpected character encountered
Aborted (core dumped)

Чтобы это исправить, мне нужно изменить строку «Sinks.File.Filter» следующим образом:

s["Sinks.File.Filter"] = "not (%Channel% matches Something)";

То есть : поместите часть condition в пару круглых скобок.

Почему я должен поставить условие в скобках? Это выглядит как критическое изменение, потому что то, что может работать с Boost 1.54, больше не может работать с Boost 1.62. Я прочитал документацию и changelog, но не нашел ничего похожего. Единственное возможное связанное изменение было в 1.55, в котором журнал изменений гласит:

Переписать некоторые синтаксические анализаторы, чтобы уменьшить размер скомпилированного двоичного файла. Переписанные парсеры более надежны в обнаружении неоднозначного и неправильного ввода.

Итак мои вопросы :

  • Я правильно делаю? Я что-то пропустил?
  • В какой версии Boost Log было введено это критическое изменение?

1 Ответ

0 голосов
/ 17 ноября 2018

Я правильно делаю? Я что-то пропустил?

Да, указание условия в скобках является правильным решением. Обоснование состоит в том, что в противном случае синтаксис является неоднозначным, поскольку часть «не% Channel%» сама по себе является допустимым фильтром, который проверяет отсутствие атрибута канала.

В какую версию Boost Log было внесено это критическое изменение?

Как вы узнали, 1.55 был первым выпуском с переписанными и более надежными парсерами. Более ранние выпуски были менее строгими, но должны принимать синтаксис, принятый новыми синтаксическими анализаторами.

...