【问题标题】:Set severity filter for sinks of a Boost.Log severity logger instance为 Boost.Log 严重性记录器实例的接收器设置严重性过滤器
【发布时间】:2014-08-11 14:16:21
【问题描述】:

我在一个项目中使用 Boost.Log 1.55.0,我确实想更改 boost::log::sources::severity_logger 实例的所有接收器的严重性过滤器。

这是一个示例,如何使用初始严重性过滤器设置接收器:

void InitializeLogging(LogLevels const kLogLevel) const {
    auto line_id = boost::log::expressions::attr<unsigned int>("LineID");
    auto severity = boost::log::expressions::attr<LogLevels>("Severity");
    auto timestamp = boost::log::expressions::format_date_time<boost::posix_time::ptime>(
        "TimeStamp",
        "%Y-%m-%d %H:%M:%S");

    boost::log::formatter const kFormatter{
        boost::log::expressions::stream
        << std::setw(6) << std::setfill('0') << line_id
        << std::setfill(' ')
        << ": " << timestamp
        << " [" << severity << "] "
        << boost::log::expressions::smessage};

    using TextSink = boost::log::sinks::synchronous_sink<boost::log::sinks::text_ostream_backend>;
    boost::shared_ptr<TextSink> sink = boost::make_shared<TextSink>();
    boost::shared_ptr<std::ostream> stream(&std::clog, boost::empty_deleter());
    sink->locked_backend()->add_stream(stream);
    sink->set_filter(severity >= kLogLevel);
    sink->set_formatter(kFormatter);

    boost::log::core::get()->add_sink(sink);
    boost::log::add_common_attributes();
}

因此,当我通过成员函数 set_filter 创建接收器时,我可以设置过滤器,但我想知道如何修改一个/多个/所有接收器的过滤器为 Boost.Log 的核心配置。

  1. 是否有任何我尚未看到的功能可以修改现有接收器?
  2. 如果不是,我是否必须从核心中移除接收器并“重新创建”它们?

【问题讨论】:

    标签: c++ logging boost boost-log


    【解决方案1】:

    我自己找到了解决方案。因此,我将在这里回答我的两个问题:

    1. 这样的功能不存在,或者我找不到。
    2. 不,可以通过调用 Boost.Log 核心上的函数set_filter 来为所有接收器设置过滤器。我正在为我的自定义严重性日志级别使用以下函数:

      void log_level(LogLevels const kLogLevel) {
        boost::log::core::get()->set_filter(boost::log::expressions::attr<CustomLogLevels>("Severity") >= kLogLevel);
      }
      

    旁注:通过调用boost::log::core::get()-&gt;remove_all_sinks() 可以从核心中删除所有接收器,但在我的用例中不是必需的。

    【讨论】:

    【解决方案2】:

    我发现以下是更改过滤器的简单方法:

    鉴于在日志初始化期间执行了以下设置:

    boost::shared_ptr<file_sink> mSink;
    mSink(new file_sink(keywords::file_name = "BoostLog_%Y%m%d_%3N.txt", keywords::rotation_size = 500 * 1024))
    mSink->set_filter(severity >= error);
    

    我使用原始过滤器记录了很多消息,然后我将过滤器更改为一个新的严重级别,如下所示:

    mSink->reset_filter();
    mSink->set_filter(severity >= warning);
    

    然后日志记录会注意新的过滤器设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-25
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      相关资源
      最近更新 更多