Self answer: I filed this problem as a bug, https://svn.boost.org/trac/boost/ticket/9291 , and got a useful answer. A workaround is found at https://svn.boost.org/trac/boost/changeset/86404#file2

cheers, Johan


2013/10/16 Johan Lundberg <lundberj@gmail.com>
Dear all,
(this is my first post to this list)

I'm trying to make a boost log sink that would filter on a severity level which should be
thread-safely modifiable while logging is ongoing.

On my way there I get errors while trying to compile this tutorial example:
     http://www.boost.org/doc/libs/1_54_0/libs/log/example/doc/tutorial_filtering.cpp

The file as-is compiles and runs fine, but if I switch on the user-provided filtering
function example by activating the block in #if 0 (and commenting out the other
definition of init()) I get errors related to phoenix bind:

The offending line is 155:
    sink->set_filter(phoenix::bind(&my_filter, severity, tag_attr));
I would be grateful for advice on how to get that working. More details on that at the end of the mail.

Now, assuming I get past the errors, what is a good way to add a per-sink log level filter? I may have
several instances of the sink. To clarify: I know this is not the right syntax, but If I could use a custom
functor or a C++11 lambda for a filter I would do something like this:
using ATseverity=std::atomic<severity_level> ; // (severity is an enum)
shared_ptr<ATseverity> shared_log_level = std::make_shared<ATseverity>(warning);

sink->set_filter(
[=shared_log_level]->bool(severity_level const& level, std::string const& tag){
return level >= shared_log_level->get();
});
I could then store and modify the shared_log_level from elsewhere.

Is there a right way to do this? 

    cheers /Johan
   

          Details on the compilation error: I think this is the relevant part of the error message:
/myboost154/include/boost/phoenix/core/preprocessed/expression_10.hpp:140:17: error: could not convert
‘boost::proto::make_expr<boost::phoenix::detail::tag::function_eval, boost::proto::domainns_::basic_default_domain,
boost::phoenix::detail::function_ptr<2, bool, bool (*)(const
boost::log::v2_mt_posix::value_ref<severity_level>&, const
boost::log::v2_mt_posix::value_ref<std::basic_string<char> >&)>,
boost::log::v2_mt_posix::expressions::attribute_keyword<tag::severity>,
boost::log::v2_mt_posix::expressions::attribute_keyword<tag::tag_attr>
>((* & a0), (* & a1), (* & a2))’
from
‘const type {aka const
boost::proto::exprns_::basic_expr<boost::phoenix::detail::tag::function_eval,
boost::proto::argsns_::list3<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal,
boost::proto::argsns_::term<boost::phoenix::detail::function_ptr<2,bool, bool (*)(const
boost::log::v2_mt_posix::value_ref<severity_level>&,
const boost::log::v2_mt_posix::value_ref<std::basic_string<char>>&)> >, 0l>,
boost::log::v2_mt_posix::expressions::attribute_keyword<tag::severity>,
boost::log::v2_mt_posix::expressions::attribute_keyword<tag::tag_attr> >, 3l>}’
to
‘boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal,
boost::proto::argsns_::term<boost::phoenix::detail::function_ptr<2,
bool, bool (*)(const boost::log::v2_mt_posix::value_ref<severity_level>&,
const boost::log::v2_mt_posix::value_ref<std::basic_string<char> >&)> >, 0l>::proto_child0 {
aka
boost::phoenix::detail::function_ptr<2, bool, bool (*)(const boost::log::v2_mt_posix::value_ref<severity_level>&,
const boost::log::v2_mt_posix::value_ref<std::basic_string<char>
>&)>}’ };

I tried boost 1.54 and compiled with gcc 4.7.1 and 4.8.1 under Linux, with and without C++11 mode:
g++ -std=gnu++11 -DBOOST_ALL_DYN_LINK boostlogexample.cpp -L $BOOST/lib/ -I $BOOST/include/ -pthread -lboost_system -lboost_log_setup -lboost_log \
-lboost_date_time -lboost_thread -lrt -lboost_filesystem