如何添加成员函数,例如增强日志过滤器?

问题描述

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

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 时,我再次不知道从哪里获取参数以传递它们。

解决方法

@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,boost::phoenix::placeholders::arg1,boost::phoenix::placeholders::arg2));

谢谢你的提示!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...