LINUX.ORG.RU

boost.log фильтры сообщений

 ,


0

2

Доброго времени суток!

Есть задача: писать каждый тип сообщений (предупреждения, ошибки, инфо и дебаг) каждый в свой файл.

в общем, на такой код

enum severity_level
{
    debug,
    info,
    warning,
    error,
    nolog
};

void TLogger::AddFileLog(severity_level level, const std::string & fname)
{
    namespace keywords = boost::log::keywords;

    boost::log::add_file_log
    (
        keywords::file_name = fname,                /*< file name pattern >*/
        keywords::rotation_size = sizelog,          /*< rotate files every 10 MiB... >*/
        keywords::format = "[%TimeStamp%]: %Message%",/*< log record format >*/
        keywords::filter=[&]()->bool{return level==loglevel;}
    );
}
Выдаются такие ошибки:
In file included from /usr/include/boost/log/utility/setup/file.hpp:28:0,
                 from logger.cpp:23:
/usr/include/boost/log/detail/sink_init_helpers.hpp: In instantiation of ‘void boost::log::v2s_mt_posix::aux::setup_filter(SinkT&, const ArgsT&, mpl_::false_) [with SinkT = boost::log::v2s_mt_posix::sinks::synchronous_sink<boost::log::v2s_mt_posix::sinks::text_file_backend>; ArgsT = boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::filter, const TLogger::AddFileLog(severity_level, const string&)::<lambda()> >, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::format, const char [25]>, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::file_name, const std::basic_string<char> >, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::rotation_size, int>, boost::parameter::aux::empty_arg_list> > > >; mpl_::false_ = mpl_::bool_<false>]’:
/usr/include/boost/log/utility/setup/file.hpp:89:108:   required from ‘boost::shared_ptr<boost::log::v2s_mt_posix::sinks::synchronous_sink<boost::log::v2s_mt_posix::sinks::text_file_backend> > boost::log::v2s_mt_posix::aux::add_file_log(const ArgsT&) [with ArgsT = boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::filter, const TLogger::AddFileLog(severity_level, const string&)::<lambda()> >, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::format, const char [25]>, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::file_name, const std::basic_string<char> >, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::rotation_size, int>, boost::parameter::aux::empty_arg_list> > > >]’
/usr/include/boost/log/utility/setup/file.hpp:127:1:   required from ‘boost::shared_ptr<boost::log::v2s_mt_posix::sinks::synchronous_sink<boost::log::v2s_mt_posix::sinks::text_file_backend> > boost::log::v2s_mt_posix::add_file_log(const T0&, const T1&, const T2&, const T3&) [with T0 = boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::file_name, const std::basic_string<char> >; T1 = boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::rotation_size, int>; T2 = boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::format, const char [25]>; T3 = boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::filter, const TLogger::AddFileLog(severity_level, const string&)::<lambda()> >]’
logger.cpp:37:5:   required from here
/usr/include/boost/log/detail/sink_init_helpers.hpp:74:60: error: no matching function for call to ‘acquire_filter(const TLogger::AddFileLog(severity_level, const string&)::<lambda()>&)’
     s.set_filter(aux::acquire_filter(args[keywords::filter]));
                                                            ^
/usr/include/boost/log/detail/sink_init_helpers.hpp:74:60: note: candidates are:
/usr/include/boost/log/detail/sink_init_helpers.hpp:47:15: note: template<class CharT> boost::log::v2s_mt_posix::filter boost::log::v2s_mt_posix::aux::acquire_filter(const CharT*)
 inline filter acquire_filter(const CharT* filter)
               ^
/usr/include/boost/log/detail/sink_init_helpers.hpp:47:15: note:   template argument deduction/substitution failed:
/usr/include/boost/log/detail/sink_init_helpers.hpp:74:60: note:   mismatched types ‘const CharT*’ and ‘TLogger::AddFileLog(severity_level, const string&)::<lambda()>’
     s.set_filter(aux::acquire_filter(args[keywords::filter]));
                                                            ^
/usr/include/boost/log/detail/sink_init_helpers.hpp:52:15: note: template<class CharT, class TraitsT, class AllocatorT> boost::log::v2s_mt_posix::filter boost::log::v2s_mt_posix::aux::acquire_filter(const std::basic_string<_CharT, _Traits, _Alloc>&)
 inline filter acquire_filter(std::basic_string< CharT, TraitsT, AllocatorT > const& filter)
               ^
/usr/include/boost/log/detail/sink_init_helpers.hpp:52:15: note:   template argument deduction/substitution failed:
/usr/include/boost/log/detail/sink_init_helpers.hpp:74:60: note:   ‘const TLogger::AddFileLog(severity_level, const string&)::<lambda()>’ is not derived from ‘const std::basic_string<_CharT, _Traits, _Alloc>’
     s.set_filter(aux::acquire_filter(args[keywords::filter]));
                                                            ^
/usr/include/boost/log/detail/sink_init_helpers.hpp:60:9: note: template<class FilterT> typename boost::enable_if<boost::phoenix::is_actor<T>, const FilterT&>::type boost::log::v2s_mt_posix::aux::acquire_filter(const FilterT&)
 >::type acquire_filter(FilterT const& filter)
         ^
/usr/include/boost/log/detail/sink_init_helpers.hpp:60:9: note:   template argument deduction/substitution failed:
/usr/include/boost/log/detail/sink_init_helpers.hpp: In substitution of ‘template<class FilterT> typename boost::enable_if<boost::phoenix::is_actor<T>, const FilterT&>::type boost::log::v2s_mt_posix::aux::acquire_filter(const FilterT&) [with FilterT = TLogger::AddFileLog(severity_level, const string&)::<lambda()>]’:
/usr/include/boost/log/detail/sink_init_helpers.hpp:74:60:   required from ‘void boost::log::v2s_mt_posix::aux::setup_filter(SinkT&, const ArgsT&, mpl_::false_) [with SinkT = boost::log::v2s_mt_posix::sinks::synchronous_sink<boost::log::v2s_mt_posix::sinks::text_file_backend>; ArgsT = boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::filter, const TLogger::AddFileLog(severity_level, const string&)::<lambda()> >, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::format, const char [25]>, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::file_name, const std::basic_string<char> >, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::rotation_size, int>, boost::parameter::aux::empty_arg_list> > > >; mpl_::false_ = mpl_::bool_<false>]’
/usr/include/boost/log/utility/setup/file.hpp:89:108:   required from ‘boost::shared_ptr<boost::log::v2s_mt_posix::sinks::synchronous_sink<boost::log::v2s_mt_posix::sinks::text_file_backend> > boost::log::v2s_mt_posix::aux::add_file_log(const ArgsT&) [with ArgsT = boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::filter, const TLogger::AddFileLog(severity_level, const string&)::<lambda()> >, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::format, const char [25]>, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::file_name, const std::basic_string<char> >, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::rotation_size, int>, boost::parameter::aux::empty_arg_list> > > >]’
/usr/include/boost/log/utility/setup/file.hpp:127:1:   required from ‘boost::shared_ptr<boost::log::v2s_mt_posix::sinks::synchronous_sink<boost::log::v2s_mt_posix::sinks::text_file_backend> > boost::log::v2s_mt_posix::add_file_log(const T0&, const T1&, const T2&, const T3&) [with T0 = boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::file_name, const std::basic_string<char> >; T1 = boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::rotation_size, int>; T2 = boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::format, const char [25]>; T3 = boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::filter, const TLogger::AddFileLog(severity_level, const string&)::<lambda()> >]’
logger.cpp:37:5:   required from here
/usr/include/boost/log/detail/sink_init_helpers.hpp:60:9: error: no type named ‘type’ in ‘struct boost::enable_if<boost::phoenix::is_actor<TLogger::AddFileLog(severity_level, const string&)::<lambda()>, void>, const TLogger::AddFileLog(severity_level, const string&)::<lambda()>&>’

Что не так и как поправить?

★★

Последнее исправление: aido (всего исправлений: 1)
Ответ на: комментарий от asaw

Ладно. видимо, я не корректно задал вопрос, потому что от буста отказываться не хочется. Более корректная формулировка: Как сделать так, чтобы прога писала сообщения в лог-файлы, при этом каждый лог соответствует типу сообщения(debug, info, warning, error), и извне задается минимальный уровень логгирования (например, ниже ворнингов мне не надо и дебаг-, инфо- файлы не будем создавать) средствами Boost.Log?

aido ★★
() автор топика
Ответ на: комментарий от aido

потому что от буста отказываться не хочется

я и не призываю отказаться от всего буста, а только от boost.log.

Как сделать так, чтобы прога писала сообщения в лог-файлы, при этом каждый лог соответствует типу сообщения(debug, info, warning, error)

Это как-то несложно делается, но у меня нет никакого желания вспоминать что-либо про boost.log настолько я им в своё время наелся, извини)

asaw ★★★★★
()

как поправить?

keywords::filter = boost::log::trivial::severity == level

Ты бы приводил полный пример сразу, что ли.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от i-rinat

эээээ... это помогло, но чем бусту не понравился мой предикат в виде лямбды? В документации ж черным по белому написано May be a string that represents a filter, or a filter lambda expression. Откуда такая избирательность?

aido ★★
() автор топика
Ответ на: комментарий от aido

filter lambda expression

Сомневаюсь, что здесь имелась в виду функция.

Boost внутри это ад из шаблонов и перегрузок, которые дают коду только выглядеть проще. Работает он по-другому.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.