Boost.Log - сообщения журнала неожиданно отфильтровываются - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь создать фильтр по настраиваемому уровню серьезности.Я написал следующий класс фильтра:

class FilterBySeverity
{
public:
    FilterBySeverity(boost::log::trivial::severity_level logLevel) :
        m_logLevel(logLevel),
        m_severityAttributeName("Severity")
    {
    }

    bool operator()(const boost::log::attribute_value_set& attrs) const noexcept
    {
        auto it = attrs.find(m_severityAttributeName);
        if (it == attrs.end()) return true;
        return it->second.extract<int>() >= m_logLevel;
    }

private:
    const boost::log::trivial::severity_level m_logLevel;
    const boost::log::attribute_name m_severityAttributeName;
};

и затем я инициализирую журнал следующим образом:

auto sink = boost::log::add_console_log(std::cout);
sink->set_filter(FilterBySeverity(logOptions.m_severity));
sink->locked_backend()->auto_flush(true);

Затем я делаю тестовый вывод:

BOOST_LOG_TRIVIAL(info) << "Logging started.";

Но я не вижу своего сообщения.Но когда я закомментирую вызов set_filter (), появится сообщение.Значение logOptions.m_severity равно 0, т.е. все сообщения должны быть разрешены.Попытался установить точку останова в операторе () и проверить, что происходит - похоже, работает правильно.Что я делаю не так?

1 Ответ

0 голосов
/ 06 февраля 2019

Проблема в неправильном типе значения атрибута, который вы пытаетесь извлечь.Вы явно указываете тип как int, тогда как регистратор, используемый BOOST_LOG_TRIVIAL, использует boost::log::trivial::severity_level.Результатом вызова extract в этом случае является пустой экземпляр value_ref, который возвращает false для любых операторов сравнения.

Лучший и более правильный способ написания фильтра - использование ключевых слов атрибута., которые заботятся как об именах атрибутов, так и их типах значений.Поскольку вы используете тривиальный API ведения журнала, библиотека уже определила ключевое слово, соответствующее атрибуту с именем «Серьезность», имеющему значения типа boost::log::trivial::severity_level: boost::log::trivial::severity.

bool operator()(const boost::log::attribute_value_set& attrs) const noexcept
{
    // returns an empty value_ref if the attribute value is not found
    // or has a different type
    auto sev = attrs[boost::log::trivial::severity];
    return !sev || sev >= m_logLevel;
}
...