[LOG]: set_filter error in tutorial_filtering.cpp and per-sink instance filtering
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... 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
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...
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
participants (1)
-
Johan Lundberg