Есть ли способ реализовать несколько независимых систем ведения журнала с помощью Boost.Log?

Boost.Log использует глобальный синглтон "core», через который проходят все сообщения журнала. Тогда кажется, что было бы непросто иметь две независимые задачи в отдельных потоках с эффективно независимыми и отдельно настраиваемыми стеками журналирования.

Например, предположим, что класс A и класс B вызывают класс C, и все три класса выполняют регистрацию. Однако я бы хотел, чтобы работа, инициированная классом A, записывалась в файл "a.log", а работа, инициируемая классом B, записывалась в файл "b.log". Есть ли идиоматический способ добиться такого результата в Boost.Log?

Мое приложение представляет собой динамически связанный C++, построенный на VC++ 2015/Windows и GCC 4.8.4/Ubuntu.


person Boinst    schedule 07.10.2015    source источник


Ответы (1)


Да, Boost.Log поддерживает этот вариант использования с помощью атрибутов и фильтрации. По сути, вам нужно иметь два файловых приемника — для a.log и b.log. В каждом приемнике нужно настроить фильтр, который будет пропускать только записи журнала, помеченные особым образом — имеющим особое значение атрибута. Затем вы добавляете регистраторы в классы A и B и убедитесь, что регистраторы имеют специальный атрибут с различными значениями, которые вы проверяете в установленных вами фильтрах.

Этот сценарий реализуется с помощью регистраторы каналов в Boost.Log. Регистратор каналов имеет атрибут под названием «Канал», который идентифицирует источник записей журнала. Вы можете создавать фильтры, используя атрибут «Канал» с лямбда-выражения или с вашим пользовательская функция.

person Andrey Semashev    schedule 07.10.2015
comment
Спасибо, это кажется хорошим подходом. этот ответ на другой вопрос (также от @andrey) оказывается почти таким же способом решения проблемы. Я думаю, что смогу реализовать то, что хочу сделать, следуя вашим предложениям. - person Boinst; 09.10.2015