C++ 增压日志1.62:过滤器条件必须在括号中?

C++ 增压日志1.62:过滤器条件必须在括号中?,c++,boost,backwards-compatibility,boost-log,C++,Boost,Backwards Compatibility,Boost Log,我正在Ubuntu 14.04和Ubuntu 18.04上使用Boost日志库。在14.04,我使用的是libboost-log1.54,而在18.04,我使用的是libboost-log1.62 我正在使用以下示例代码(称为main.cpp): 为了解决这个问题,我需要将“Sinks.File.Filter”行修改为: s[“Sinks.File.Filter”]=“不是(%Channel%匹配某个内容)” 即:将条件部分放在一对括号中 为什么我必须把条件放在括号里?这看起来像是一个突破性的改

我正在Ubuntu 14.04和Ubuntu 18.04上使用Boost日志库。在14.04,我使用的是
libboost-log1.54
,而在18.04,我使用的是
libboost-log1.62

我正在使用以下示例代码(称为
main.cpp
):

为了解决这个问题,我需要将“Sinks.File.Filter”行修改为:

s[“Sinks.File.Filter”]=“不是(%Channel%匹配某个内容)”

:将
条件
部分放在一对括号中

为什么我必须把条件放在括号里?这看起来像是一个突破性的改变,因为使用Boost1.54可以运行的东西不能再使用Boost1.62运行了。我通读了和,但没有发现任何似乎相关的东西。唯一可能相关的更改是
1.55
,其中更改日志显示:

重写了一些解析器以减少编译的二进制大小。重写的解析器在检测不明确和不正确的输入时更加健壮

所以我的问题是:

  • 我做得对吗?我错过什么了吗
  • 这一突破性的变化引入了哪个版本的Boost日志
我做得对吗?我错过什么了吗

是的,将条件放在括号中是正确的解决方案。其基本原理是,否则语法是不明确的,因为“not%Channel%”部分本身就是一个有效的过滤器,用于测试通道属性是否存在

这一突破性的变化引入了哪个版本的Boost日志

正如您所发现的,1.55是第一个具有重写和更健壮解析器的版本。早期版本没有那么严格,但是应该接受新解析器所接受的语法

#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;
}
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)