Boost Log: взаимодействие файла настроек журнала и конфигурации кода

У меня есть хороший формат и консольный журнал:

auto fmtStream = expressions::stream
<< "LineID: " << expressions::attr<unsigned int>("LineID") << " "<< "Message: " << expressions::message:

boost::log::add_console_log(std::cout, keywords::format = fmtStream);

Поток форматирования, конечно, несколько длиннее.
Теперь я хочу дать пользователю настроить логирование:

std::ifstream file("log.conf");
init_from_stream(file);

Большая часть форматирования, используемого в fmtStream, невозможна при использовании строки форматирования в файле конфигурации.

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

Возможности, которые я вижу для этого:

1) Дайте журналу консоли, который я определил в своем коде, имя. Теперь пользователь может изменить его с помощью приемника с тем же именем.

2) Установите формат по умолчанию, который принимается для всех приемников. Но согласно Boost Log изменяет стандартное ведение журнала :: основной форматер? это невозможно.

3) Есть еще идеи?

Спасибо!

0

Решение

init_from_stream а также init_from_settings функции будут инициализировать библиотеку, как указано в настройках. Эти функции предназначены для настройки библиотеки с нуля, поэтому они будут добавлять новые приемники с указанными настройками, включая фильтры и форматеры. Если все, что вам нужно, это настроить средство форматирования для существующего приемника и не разрешить полную настройку регистрации, вам следует интерпретировать файл настроек самостоятельно.

Вы можете разобрать файл настроек с помощью parse_settings функция. От него вы получите settings (или же wsettings) объект, который вы можете анализировать и изменять, как описано Вот а также Вот (извините за плохое форматирование в справочных документах). Поскольку вы, вероятно, не планируете поддерживать все приемники и параметры, поддерживаемые Boost.Log, вы не привязаны к семантике, которую Boost.Log вставляет в параметры, и можете интерпретировать настройки любым удобным для вас способом. Например, вы можете выбрать только чтение форматера приемника:

boost::log::settings setts = boost::log::parse_settings(file);
if (boost::optional<std::string> fmt = setts["MySink"]["Format"])
{
// Sink format is specified in the setting file
}

Теперь, чтобы превратить эту строку формата в форматтер, вам понадобится parse_formatter функция (формат строки описан Вот). Эта функция возвращает объект форматирования, который вы можете установить в свой приемник, при условии, что вы сохранили указатель на него.

auto sink = boost::log::add_console_log(std::cout, keywords::format = fmtStream);
boost::log::settings setts = boost::log::parse_settings(file);
if (boost::optional<std::string> fmt = setts["MySink"]["Format"])
{
sink->set_formatter(boost::log::parse_formatter(fmt.get()));
}

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

2

Другие решения


По вопросам рекламы [email protected]