Boost::Log::Tutorial::Trivial logging with filters

Trivial logging with filters

虽然严重性级别有利于提供更多的信息,但通常您会希望应用过滤器,只将重要的记录输出,而忽略其余的记录。通过在库核心中设置一个全局过滤器,很容易做到这一点,如下所示:

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

namespace logging = boost::log;

void init()
{
    logging::core::get()->set_filter
    (
        logging::trivial::severity >= logging::trivial::info
    );
}

int main(int, char*[])
{
    init();

    BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
    BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
    BOOST_LOG_TRIVIAL(info) << "An informational severity message";
    BOOST_LOG_TRIVIAL(warning) << "A warning severity message";
    BOOST_LOG_TRIVIAL(error) << "An error severity message";
    BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";

    return 0;
}

现在,如果我们运行这个代码示例,前两个日志记录将被忽略,而剩下的四个将被传递到控制台。

重要提示
记住,stream表达式只在日志记录通过过滤器时才执行。不要在stream表达式中做业务关相关的调用,因为如果这些日志记录被过滤掉,这些调用可能不会被执行。

必须对过滤器设置表达式说几句。由于我们正在设置一个全局过滤器,所以我们必须获得 logging core 实例。这就是 logging:core::get() 所做的,它返回一个指向核心单例的指针。logging core 的 set_filter 方法设置全局过滤函数。本例中的过滤器被构建为 Boost.Phoenix lambda 表达式。在我们的例子中,这个表达式由一个逻辑谓词组成,其左边的参数是一个占位符,用于描述要检查的属性,右边的参数是要检查的值。severity 关键字是由库所提供的占位符。此占位符标识模板表达式中的 severity 属性值;这个值应该有名称 “Severity” 和类型 severity_level。 在 trivial logging 中该属性是由库自动提供的;用户只需在 logging 语句中提供其值。占位符与关系操作符一起创建一个函数对象,logging core 将调用该对象来过滤 log records。因此,只有严重级别不低于info的日志记录才能通过过滤器,并最终到达控制台。

将像这样的逻辑谓词相互组合,可以构建更复杂的过滤器,甚至可以自定义作为过滤器的函数(包括c++ 11 lambda函数)。我们将在后面的章节节中再次说明过滤器。

猜你喜欢

转载自www.cnblogs.com/kohlrabi/p/9142812.html