Фильтр уровня серьезности ведения журналов Boost не соблюдается

Это сводит меня с ума. Я явно устанавливаю уровень серьезности, но boost.log его не учитывает. Все сообщения со всеми уровнями серьезности регистрируются.

вот код, который я использую:

флаг is_verbose явно получен из командной строки. И сообщение, зарегистрированное через:

BOOST_LOG_TRIVIAL(debug) << "Hello there!" ;

будут зарегистрированы и показаны на терминале.

Спасибо.

#include "boost/log/core.hpp"
#include "boost/log/expressions.hpp"
#include "boost/log/utility/setup/file.hpp"
#include "boost/log/trivial.hpp"
#include "boost/log/attributes.hpp"
#include "boost/log/utility/setup/common_attributes.hpp"

#include "Logger.h"

namespace logging = boost::log;

void Logger::init(bool is_verbose) {

    if(is_verbose)
        logging::core::get()->set_filter(
            logging::trivial::severity >= logging::trivial::info);
    else
        logging::core::get()->set_filter(
            logging::trivial::severity >= logging::trivial::error);   

    namespace keywords = boost::log::keywords;
    namespace sinks = boost::log::sinks;

    logging::add_file_log(
            keywords::auto_flush = true,
            keywords::file_name = "sample_%N.log",
            keywords::rotation_size = 10 * 1024 * 1024,
            keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0),
            keywords::format = "[%TimeStamp%][%Severity%]: %Message%"
            );

    logging::add_common_attributes();

}

person hebbo    schedule 02.09.2015    source источник


Ответы (1)


Это работает

Жить на Coliru

#define BOOST_ALL_DYN_LINK

#include <boost/log/core.hpp>
#include <boost/log/sources/logger.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/attributes.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>

namespace logging = boost::log;

struct Logger {
    void init(bool is_verbose) {
        namespace keywords = boost::log::keywords;
        namespace sinks    = boost::log::sinks;
        namespace trivial  = boost::log::trivial;

        if(!is_verbose)
            logging::core::get()->set_filter(trivial::severity >= trivial::warning);   

        logging::add_file_log(
                keywords::auto_flush          = true,
                keywords::file_name           = is_verbose? "verbose_%N.log":"sample_%N.log",
                keywords::rotation_size       = 10 * 1024 * 1024,
                keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0),
                keywords::format              = "[%TimeStamp%][%Severity%]: %Message%"
            );

        logging::add_common_attributes();
    }
};

int main(int argc, char**) {
    Logger logger;
    logger.init(argc>1);

    {
        using sl = boost::log::trivial::severity_level;
        logging::sources::severity_logger<sl> lg;

        BOOST_LOG_SEV(lg, sl::trace) << "trace";
        BOOST_LOG_SEV(lg, sl::fatal) << "fatal";
    }

    BOOST_LOG_TRIVIAL(trace) << "trivial trace";
    BOOST_LOG_TRIVIAL(fatal) << "trivial fatal";
}

Тестирование:

g++ -std=c++11 -Os -Wall -pedantic -pthread main.cpp \
      -lboost_thread -lboost_system -lboost_log -lboost_log_setup
./a.out
./a.out -v
tail *.log

Отпечатки

==> sample_0.log <==
[2015-Sep-02 09:49:22.172371][]: fatal
[2015-Sep-02 09:49:22.174915][]: trivial fatal

==> verbose_0.log <==
[2015-Sep-02 09:49:22.226536][]: trace
[2015-Sep-02 09:49:22.227292][]: fatal
[2015-Sep-02 09:49:22.227380][]: trivial trace
[2015-Sep-02 09:49:22.227408][]: trivial fatal
person sehe    schedule 02.09.2015
comment
привет @sehe, на boost.logging влияет какая-то переменная env или что-то в этом роде? Я скопировал ваш код в файл, скомпилировал его с помощью вашей команды выше и выполнил те же команды, что и вы. ни в том, ни в другом случае ничего не появилось. Ни уровня трассировки, ни даже сообщений о фатальном уровне. Совершенно ничего. И в моем проекте я все еще вижу сообщения, независимо от того, выбрал ли я подробный режим или нет. У него есть собственный разум. - person hebbo; 02.09.2015
comment
Вероятно, вам следует начать устранять (удалять/комментировать) код, пока вы не увидите изменение поведения. Сосредоточьтесь на коде инициализации. - person sehe; 03.09.2015