【问题标题】:How do I add a member function as e.g. Boost Log filter?如何添加成员函数,例如提升日志过滤器?
【发布时间】:2021-06-02 11:38:39
【问题描述】:

我想通过以下方式添加一个成员函数作为日志过滤器:

boost::log::core::get()->set_filter(boost::phoenix::bind(&LoggerContext::checkIfShouldBeLogged, this, <WHICH_ARGUMENT_DO_I_PASS?>));

过滤函数的签名在哪里

bool LoggerContext::checkIfShouldBeLogged(const boost::log::attribute_value_set &attributeValueSet);

正如文档中描述的那样。

我不知道要从我尝试添加过滤器的函数中传递哪个参数。

如果我将该函数设为静态,我可以简单地省略参数并像这样设置过滤器:

boost::log::core::get()->set_filter(&LoggerContext::checkIfShouldBeLogged);

参数似乎被神奇地传递了。

设置自定义格式化程序也是如此。以下适用于静态函数:

sink->set_formatter(&LoggerContext::fileFormatter);

签名

void LoggerContext::fileFormatter(boost::log::record_view const &rec, boost::log::formatting_ostream &strm);

但是当使用boost::phoenix::bind 时,我再次不知道从哪里获取参数以便传递它们。

【问题讨论】:

  • 不熟悉 boost phoenix 但对于boost::bind,您需要传递一个占位符对象以将该参数暴露给调用者:set_filter(boost::phoenix::bind(&amp;LoggerContext::checkIfShouldBeLogged, this, _1));。否则,您可以简单地尝试使用 lambda:set_filter([this](auto &amp;attrValueSet) { return checkIfShouldBeLogged(attrValueSet); })
  • 阅读Lambda expressions记录占位符部分我发现了如何将成员函数作为格式化程序#include &lt;boost/log/expressions/record.hpp&gt; sink-&gt;set_formatter(boost::phoenix::bind(&amp;LoggerContext::fileFormatter, this, expressions::record, expressions::stream));传递,但仍然不知道如何访问boost::log::attribute_value_set

标签: c++ boost boost-log


【解决方案1】:

@Jorge Bellon:我刚刚读到你的评论,它给了我一个很好的提示,了解它是如何工作的。

解决方案是使用boost::phoenix 占位符。这适用于格式化程序和过滤器:

boost::log::core::get()->set_filter(boost::phoenix::bind(&LoggerContext::checkIfShouldBeLogged, this, boost::phoenix::placeholders::arg1));

sink->set_formatter(boost::phoenix::bind(&LoggerContext::fileFormatter, this, boost::phoenix::placeholders::arg1, boost::phoenix::placeholders::arg2));

感谢您的提示!

【讨论】:

  • 乐于助人!您是否尝试过使用 C++11 lambda?它更具可读性。
  • 我不经常使用 lambda,因为我不喜欢这个概念。但可以肯定的是,下次我必须使用它们时,我会看看 C++11 lambdas。
猜你喜欢
  • 1970-01-01
  • 2016-01-19
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
相关资源
最近更新 更多