Произошла ошибка boost.log при использовании sink.set_filter - PullRequest
1 голос
/ 02 июля 2019

Я использую boost.log для своего проекта.Но когда я попытался установить фильтр для приемников, появились ошибки компиляции. Код

прост:

BOOST_LOG_ATTRIBUTE_KEYWORD(MyTag, "My_Tag", std::string);
BOOST_LOG_INLINE_GLOBAL_LOGGER_CTOR_ARGS(
        my_logger
        , boost::log::sources::channel_logger_mt< >
        , (boost::log::keywords::channel = "default"))

typedef boost::log::sinks::synchronous_sink<
            boost::log::sinks::text_ostream_backend > TextSink;
boost::shared_ptr< TextSink > logSink = boost::make_shared< TextSink >();
auto backSink = boost::make_shared<std::ofstream>("default.log");

!!! compilation error, no add_attribute in channel_logger !!!
my_logger::get().add_attribute("My_Tag"
                , boost::log::attributes::constant<String>("My_Tag"));

logSink->set_filter(
                    boost::log::expressions::has_attr(MyTag)
!!! compilation error, invalid operand expression between attribute_actor and std::string !!!
                    && boost::log::expressions::attr<std::string>("My_Tag")==std::string("My_Tag")
!!! compilation error, invalid operand expression between attribute_keyword<tag::MyTag> and char[7] !!!
                    && MyTag=="My_Tag"

Я также попытался определить функцию фильтра, но получил следующую ошибку:

bool my_filter(
            boost::log::value_ref< std::string
!!! compilation error, no tag_attr in boost::log::expressions::tag !!!
            , boost::log::expressions::tag::tag_attr > const& tag)
{
    return level >= warning || tag == "IMPORTANT_MESSAGE";
}

Кстати, у меня тоже есть следующая ошибка, но эта ошибка исчезнет, ​​если все остальные ошибки компиляции будут устранены.

!!! no open_record in severity_logger_mt !!!
BOOST_LOG_SEV(slg, normal) << "A regular message";

Может кто-нибудь мне помочь?


полный код:

#include <boost/phoenix/operator.hpp>
#include <boost/log/sources/channel_logger.hpp>
#include <boost/log/attributes.hpp>
#include <boost/log/attributes/attribute.hpp>
#include <boost/log/attributes/attribute_cast.hpp>
#include <boost/log/keywords/filter.hpp>
#include <boost/log/expressions/predicates.hpp>
#include <boost/log/expressions/attr_fwd.hpp>
#include <boost/log/expressions/attr.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/sinks.hpp>

BOOST_LOG_INLINE_GLOBAL_LOGGER_CTOR_ARGS(
        my_channel_logger
        , boost::log::sources::channel_logger_mt< >
        , (boost::log::keywords::channel = "channel"))

BOOST_LOG_ATTRIBUTE_KEYWORD(MyTag, "My_Tag", std::string);

typedef boost::log::sinks::synchronous_sink<
            boost::log::sinks::text_ostream_backend > TextSink;
static boost::shared_ptr< TextSink > logSink = boost::make_shared< TextSink >();
static auto backSink = boost::make_shared<std::ofstream>("output.log");
void func() {

    !!! compilation error, no 'open_record' in channel_logger_mt !!!
    BOOST_LOG_CHANNEL(my_channel_logger::get(), "channel")<<"channel log";

    !!! compilation error, no add_attribute in channel_logger !!!
    my_channel_logger::get().add_attribute("My_Tag"
       , boost::log::attributes::constant<String>("My_Tag"));
}

ошибка компиляции для no open_record in channel_logger_mt:

***.cpp:87:5: error: no member named 'open_record' in 'boost::log::v2_mt_nt6::sources::channel_logger_mt<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >'
channel_feature.hpp:236:41: note: expanded from macro 'BOOST_LOG_CHANNEL'
channel_feature.hpp:231:5: note: expanded from macro 'BOOST_LOG_STREAM_CHANNEL'
record_ostream.hpp:566:5: note: expanded from macro 'BOOST_LOG_STREAM_WITH_PARAMS'
record_ostream.hpp:555:50: note: expanded from macro 'BOOST_LOG_STREAM_WITH_PARAMS_INTERNAL'

ошибка компиляции для no add_attribute in channel_logger_mt:

***.cpp:76:31: error: no member named 'add_attribute' in 'boost::log::v2_mt_nt6::sources::channel_logger_mt<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >'

1 Ответ

1 голос
/ 02 июля 2019

Скорее всего, вам не хватает #include с в вашем коде.

!!! compilation error, no add_attribute in channel_logger !!!
my_logger::get().add_attribute("My_Tag"
                , boost::log::attributes::constant<String>("My_Tag"));

add_attribute определяется как basic_composite_logger, из которых channel_logger_mt черпает .Вам необходимо включить boost/log/sources/channel_logger.hpp.

!!! compilation error, invalid operand expression between attribute_actor and std::string !!!
                    && boost::log::expressions::attr<std::string>("My_Tag")==std::string("My_Tag")
!!! compilation error, invalid operand expression between attribute_keyword<tag::MyTag> and char[7] !!!
                    && MyTag=="My_Tag"

Скорее всего, вам не хватает включения boost/phoenix/operator.hpp.Или вы можете включить boost/log/expressions.hpp, который автоматически включает его для вас.

!!! no open_record in severity_logger_mt !!!
BOOST_LOG_SEV(slg, normal) << "A regular message";

То же, что и channel_logger_mt.Необходимо включить boost/log/sources/severity_logger.hpp.

Обратите внимание, что для каждого компонента в документах в самом начале раздела есть список связанных заголовков Boost.Log. Здесь является примером для регистратора серьезности.


Обновление на 2019-07-03:

Ваш полный код компилируется, еслидобавлены следующие включения:

#include <string>
#include <fstream>
#include <boost/smart_ptr/shared_ptr.hpp>
#include <boost/smart_ptr/make_shared_object.hpp>
#include <boost/log/sources/global_logger_storage.hpp>
#include <boost/log/sources/record_ostream.hpp>

Мне также пришлось удалить "!!!"и используйте std::string вместо String в атрибуте constant.

Как правило, вы должны включать заголовок для каждого компонента, который вы используете в своем коде.

...