代码之家  ›  专栏  ›  技术社区  ›  ivan.ukr

初始化Boost日志接收器时将函数对象作为筛选器传递

  •  0
  • ivan.ukr  · 技术社区  · 6 年前

    我正在创建新的水槽,如下面的示例所示:

    void init()
    {
        logging::add_file_log
        (
            keywords::file_name = "sample_%N.log",
            keywords::rotation_size = 10 * 1024 * 1024,
            keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0),
            keywords::format = "[%TimeStamp%]: %Message%"
        );
    
        logging::core::get()->set_filter
        (
            logging::trivial::severity >= logging::trivial::info
        );
    } 
    

    我已经实现了自己的筛选对象:

    struct MyFilter {
        ...
        bool operator()(const boost::log::attribute_value_set& attrs) const noexcept
        {
            bool result = ....
            // Do my filtering
            return result;
        }
        ...
    };
    

    如何将其作为接收器初始化参数传递? 也就是说,我想添加以下参数:

    keywords::filter = SOMETHING(MyFilter())
    

    但到目前为止,我还不知道“某物”应该是什么。找不到任何示例。你能帮帮我吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Andrey Semashev    6 年前

    第一, keywords::format 用于传递格式化程序,而不是筛选器。过滤器使用 keywords::filter 参数关键字。

    第二,两者 关键字::格式 关键字::筛选 关键字当前只支持字符串参数。接受的字符串根据所描述的语法进行解释。 here 分别作为格式化程序或筛选器。

    如果要将函数对象设置为筛选器,则应调用 set_filter 在使用函数对象创建的接收器上。 add_file_log 返回一个指向所创建接收器的指针,因此可以这样做:

    auto sink = logging::add_file_log(...);
    sink->set_filter(MyFilter());
    

    同样适用于格式化程序;格式化接收器提供 set_formatter 方法。