显式检查boost :: log过滤器?

n. *_* m. 10 c++ boost boost-log c++11

我有一些琐碎的日志记录:

BOOST_LOG_TRIVIAL(trace) << make_trace_record();
Run Code Online (Sandbox Code Playgroud)

现在make_trace_record是一个有点贵的功能(不要问为什么,这很复杂).我只想在日志当前通过过滤时调用它.我怎样才能做到这一点?我没有看到明确调用严重性过滤器的方法.

Aco*_*orn 4

Boost.Log预先过滤;因此,make_trace_record()如果严重性不够高,则不会被调用。

为了设置普通记录器的严重性过滤器,请调用:

boost::log::core::get()->set_filter(
    boost::log::trivial::severity >= boost::log::trivial::...
);
Run Code Online (Sandbox Code Playgroud)

例如,以下示例输出1,表明expensive()仅调用一次:

Live On Coliru

#include <iostream>

#include <boost/log/expressions.hpp>
#include <boost/log/trivial.hpp>

int count = 0;

int expensive()
{
    return ++count;
}

int main()
{
    boost::log::core::get()->set_filter(
        boost::log::trivial::severity >= boost::log::trivial::warning
    );

    BOOST_LOG_TRIVIAL(error) << expensive();
    BOOST_LOG_TRIVIAL(info) << expensive();

    std::cout << count << '\n';

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

印刷:

[2018-05-21 14:33:47.327507] [0x00007eff37aa1740] [error]   1
1
Run Code Online (Sandbox Code Playgroud)

对于那些想知道它是如何工作的人,请查看:Boost Log 的简单记录器的“惰性求值”是如何工作的?

  • 这真是令人印象深刻。出乎意料:)现在我想把它放到 https://github.com/andreasfertig/cppinsights 来了解如何 (2认同)