Boost Log 1.62:过滤条件必须放在括号中吗?

时间:2018-11-07 20:57:39

标签: c++ boost backwards-compatibility boost-log

我正在Ubuntu 14.04和Ubuntu 18.04上使用Boost Log库。在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运行。我通读了documentationchangelog,但没有发现任何看似相关的内容。唯一可能相关的更改是在1.55中,更改日志显示:

  

重写了一些解析器以减小编译后的二进制大小。重写的解析器在检测模棱两可和错误的输入时更加强大。

我的问题是

  • 我做对了吗?我错过了什么吗?
  • 引入了哪个重大版本的Boost Log?

1 个答案:

答案 0 :(得分:1)

  

我做对了吗?我错过了什么吗?

是的,将条件放在括号中是正确的解决方案。这样做的理由是,否则语法是模棱两可的,因为“ not%Channel%”部分本身就是有效的过滤器,用于测试Channel属性的缺失。

  

引入了哪个重大版本的Boost Log?

您已经发现,1.55是第一个发布版本,具有重写的和更强大的解析器。较早的版本没有那么严格,但是应该接受新解析器所接受的语法。