【发布时间】: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(&LoggerContext::checkIfShouldBeLogged, this, _1));。否则,您可以简单地尝试使用 lambda:set_filter([this](auto &attrValueSet) { return checkIfShouldBeLogged(attrValueSet); })。 -
阅读Lambda expressions的记录占位符部分我发现了如何将成员函数作为格式化程序
#include <boost/log/expressions/record.hpp> sink->set_formatter(boost::phoenix::bind(&LoggerContext::fileFormatter, this, expressions::record, expressions::stream));传递,但仍然不知道如何访问boost::log::attribute_value_set?