Я работаю с библиотекой 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 было введено это критическое изменение?