C++ 是否明确检查boost::log过滤器?

C++ 是否明确检查boost::log过滤器?,c++,c++11,boost,boost-log,C++,C++11,Boost,Boost Log,我有一些琐碎的日志记录: BOOST_LOG_TRIVIAL(trace) << make_trace_record(); BOOST\u LOG\u triple(trace)我会用一个中间类来实现这一点,这个中间类的ostream操作符会懒洋洋地调用您的函数 大概是这样的: #include <type_traits> #include <utility> #include <ostream> #include <iostream>

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

BOOST_LOG_TRIVIAL(trace) << make_trace_record();

BOOST\u LOG\u triple(trace)我会用一个中间类来实现这一点,这个中间类的ostream操作符会懒洋洋地调用您的函数

大概是这样的:

#include <type_traits>
#include <utility>
#include <ostream>
#include <iostream>


namespace detail
{
    // an ostreamable object that will stream out the result of a unary function object call
    template<class F>
    struct lazy_generator
    {
        void write(std::ostream& os) const
        {
            os << generator_();
        }

        friend std::ostream& operator<<(std::ostream& os, lazy_generator const& tr)
        {
            tr.write(os);
            return os;
        }

        F generator_;
    };
}

// construct a lazy_generator
template<class F>
auto lazy_trace(F&& f)
{
    return detail::lazy_generator<std::decay_t<F>>({std::forward<F>(f)});
}

// test
int main()
{
    extern std::string make_trace_record();

    // function pointer
    std::clog << lazy_trace(&make_trace_record);

    // function object
    std::clog << lazy_trace([](){ return make_trace_record(); });
}
#包括
#包括
#包括
#包括
名称空间详细信息
{
//一个ostreamable对象,它将从一元函数对象调用的结果中流出
模板
结构单元生成器
{
空写(std::ostream&os)常量
{

osBoost.Log预先进行筛选;因此,如果严重性不够高,则不会调用
make\u trace\u record()

要为普通记录器设置严重性筛选器,请调用:

boost::log::core::get()->set_filter(
    boost::log::trivial::severity >= boost::log::trivial::...
);
例如,下面的示例输出了
1
,表明
昂贵()
只被调用一次:

#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;
}
对于那些想知道它是如何工作的人,请看一看:

Acorn正确地指出Boost.Log宏已经实现了流式表达式的条件执行。此行为记录在中

我要补充的是,您可以手动生成日志记录,避免使用宏。下面给出了一个示例:

logging::record rec=lg.open_record();
如果(rec)
{
日志记录:记录团队的strm(rec);

strm这真是令人印象深刻。而且出乎意料:)现在我想把它放进去,以理解为什么哇,这确实出乎意料。它之所以有效,是因为BOOST_LOG_trival()并没有扩展到一个表达式,而是扩展到一个部分if语句。@n.m:实际上,它扩展到一个
for
循环,但实际上,技巧是一样的(请参阅我发布的链接问题)。我已经考虑过这个问题,但它看起来有点过头了,幸运的是,它不是必需的。由于boost宏(非军用但仍在工作),评估已经短路。请参阅其他答案。
[2018-05-21 14:33:47.327507] [0x00007eff37aa1740] [error]   1
1
logging::record rec = lg.open_record();
if (rec)
{
    logging::record_ostream strm(rec);
    strm << "Hello, World!";
    strm.flush();
    lg.push_record(boost::move(rec));
}