Как настроить 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
, В результате анализируемый фильтр не может распознать уровень серьезности и отклоняет запись журнала.
Вам необходимо указать тип значения атрибута, зарегистрировав фабрику фильтров, как описано в этом разделе. По сути, это необходимо сделать для любых атрибутов, которые имеют типы значений, отличные от упомянутых в этом разделе. Рекомендуется зарегистрировать все атрибуты, даже перечисленные, потому что в противном случае библиотека должна выполнить более дорогой поиск по всем типам, поддерживаемым по умолчанию при обработке фильтра.
Вам также может понадобиться зарегистрировать фабрику форматирования, аналогичную фабрике фильтров.