【问题标题】:boost.log : using c++11 lambda expression to filter severity levelboost.log : 使用 c++11 lambda 表达式过滤严重级别
【发布时间】:2015-11-30 16:53:29
【问题描述】:

我正在使用 Boost.Log 实现一个记录器 我有一个全局记录器,它有一个到控制台的接收器和一个可选的文件,如果调用了 init 方法。

我想使用 C++11 lambda 表达式来设置严重性过滤器。从文档看来这是可能的:http://www.boost.org/doc/libs/1_59_0/libs/log/doc/html/log/tutorial/trivial_filtering.html

但是我没有找到任何示例,并且我的幼稚方法没有编译。

我的初始化函数如下所示:

template <typename filter_type>
void init_log_file( filter_type filter)
{
    boost::shared_ptr< boost::log::sinks::text_file_backend > backend =
        boost::make_shared< boost::log::sinks::text_file_backend >
            (
            boost::log::keywords::file_name = "log_%Y-%m-%d_%H-%M-%S.%N.log", 
            boost::log::keywords::rotation_size = 10 * 1024 * 1024,
            boost::log::keywords::max_size = 1000 * 1024 * 1024,
            boost::log::keywords::min_free_space = 2000 * 1024 * 1024,
            boost::log::keywords::auto_flush = true
        );
typedef boost::log::sinks::synchronous_sink< boost::log::sinks::text_file_backend > sink_t;
boost::shared_ptr< sink_t > sink(new sink_t(backend));

    sink->set_filter( filter(severity) );
    //sink->set_filter( filter(severity.or_none(), tag_attr.or_none()) );
    boost::log::core::get()->add_sink(sink);
}

我按如下方式调用初始化:

int main() 
{
    //typedef boost::log::value_ref< custom_severity_level, tag::severity > sev_type;
    typedef boost::log::expressions::attribute_keyword<tag::severity> sev_type;
   init_log_file([](sev_type const& level)
   {
       return level == custom_severity_level::ERROR;
   });

   return 0;
}

我尝试了几件事,但是 lambda 参数类型不匹配,或者我收到错误:

错误:未定义模板的隐式实例化 'boost::log::v2_mt_posix::expressions::aux::date_time_formatter_generator_traits' m_name(name), m_formatter(formatter_generator::parse(format)), m_visitor_invoker(fallback)

任何关于如何正确地做我想做的事情的提示都会很棒

提前感谢您的回复

编辑:Kassiar 的回答解决了我的问题。

【问题讨论】:

    标签: c++11 logging boost lambda


    【解决方案1】:

    我发现以下签名的函数符合set_filter 方法的要求:

    bool(const boost::log::attribute_value_set&)
    

    使用此签名,Boost.Log 教程中的Trivial logging with filters example 可以实现如下:

    #include <boost/log/trivial.hpp>
    #include <boost/log/core.hpp>
    #include <boost/log/expressions.hpp>
    
    namespace logging = boost::log;
    namespace sinks = boost::log::sinks;
    
    void init_logging()
    {
        logging::core::get()->set_filter([](const logging::attribute_value_set& attr_set)
        {
            return attr_set["Severity"].extract<logging::trivial::severity_level>() >= logging::trivial::info;
        });
    }
    
    int main(int argc, char** argv)
    {
        init_logging();
    
        BOOST_LOG_TRIVIAL(trace) << "Trace level log message";
        BOOST_LOG_TRIVIAL(debug) << "Debug level log message";
        BOOST_LOG_TRIVIAL(info) << "Info level log message";
        BOOST_LOG_TRIVIAL(warning) << "Warning level log message";
        BOOST_LOG_TRIVIAL(fatal) << "Fatal level log message";
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 2018-06-07
      • 2011-03-28
      • 1970-01-01
      相关资源
      最近更新 更多