У меня есть хороший формат и консольный журнал:
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) Есть еще идеи?
Спасибо!
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()));
}
Есть еще одна вещь, которую нужно запомнить. Если вы используете значения атрибутов пользовательских типов в вашем устройстве форматирования, например, перечисления для серьезности, вам придется зарегистрировать эти типы в библиотеке перед анализом средства форматирования. Таким образом, синтаксический анализатор сможет создать средство форматирования, которое знает ваши типы и использует соответствующие операторы форматирования. Есть руководство описывая, как это сделать.