Как настроить Boost logging filter в файле конфигурации

Я использую Boost 1.63 в VS2015 на Windows 10.

Код следующий пример Boost.

Вот код, кажется, что запись, сгенерированная 'severityLogger.open_record', НЕ действительна, она не входит в оператор if.

#include <boost/format.hpp>
#include <boost/locale/generator.hpp>
#include <boost/log/core.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/from_settings.hpp>
#include <boost/log/utility/setup/settings_parser.hpp>
#include <boost/phoenix.hpp>

namespace logging = boost::log;
namespace expr = boost::log::expressions;
namespace keywords = boost::log::keywords;
namespace sinks = boost::log::sinks;
namespace src = boost::log::sources;

src::wseverity_logger<logging::trivial::severity_level> severityLogger;
std::wifstream strm(L"config\\logger.ini");
strm.imbue(std::locale(strm.getloc(), new std::codecvt_utf8<wchar_t, 0x10ffff, std::consume_header>));
auto settings = logging::parse_settings(strm);
logging::init_from_settings(settings);
logging::add_common_attributes();

auto rec = severityLogger.open_record(keywords::severity = logging::trivial::severity_level::info);
if (rec) { // Unable to go here !!!
    logging::wrecord_ostream strm(rec);
    strm << L"Some message";
    strm.flush();
    severityLogger_.push_record(boost::move(rec));
}

Тем не менее, он работает нормально, если я добавлю этот кусок кода:

logging::core::get()->set_filter(
    logging::trivial::severity >= logging::trivial::info);

Вот мой файл конфигурации:

[Core]
DisableLogging=false
Filter="%Severity% >= info"

[Sinks.File]
Destination=TextFile
FileName="App_%Y-%m-%d.%N.log"
Format="%TimeStamp% %Severity% - %Message%"
AutoFlush=true
TimeBasedRotation="00:00:00"
RotationSize=10485760

1 ответ

Решение

Проблема в том, что по умолчанию анализатор фильтров не ожидает атрибут типа logging::trivial::severity_level, В результате анализируемый фильтр не может распознать уровень серьезности и отклоняет запись журнала.

Вам необходимо указать тип значения атрибута, зарегистрировав фабрику фильтров, как описано в этом разделе. По сути, это необходимо сделать для любых атрибутов, которые имеют типы значений, отличные от упомянутых в этом разделе. Рекомендуется зарегистрировать все атрибуты, даже перечисленные, потому что в противном случае библиотека должна выполнить более дорогой поиск по всем типам, поддерживаемым по умолчанию при обработке фильтра.

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

Другие вопросы по тегам