Boost::Log Безопасность использования одного и того же бэкенда с несколькими приемниками

У меня не настоящая проблема, а скорее вопрос правильного использования.

Предисловие: я использую boost::log в качестве средства ведения журнала и работаю над некоторыми библиотеками, которые будут совместно использоваться различными приложениями, и всем им могут потребоваться разные уровни ведения журнала. Я придумал настройку, в которой у меня есть (или могут быть) определенные каналы и уровни серьезности для каждой библиотеки, а также своего рода фабрика, которая позволяет приложению, использующему библиотеку, создавать надлежащие/желаемые приемники для библиотеки без необходимость знать подробности о каналах библиотеки и уровнях серьезности.

Теперь реальный вопрос: желая собрать все журналы приложения в определенных «местах» (например, в стандартном выводе или в некоторых файлах, связанных с серьезностью), я планировал передать все соответствующие приемники с одним и тем же бэкэндом; правилен ли этот подход? Я не нашел ничего против этого в документах, но ни одного примера, показывающего это использование...

Примером может быть:

namespace bl = boost::log;
namespace bl_snk = boost::log::sinks;
.
.
.
boost::shared_ptr< bl_snk::text_file_backend > text_backend = boost::make_shared< bl_snk::text_file_backend >(
                bl::keywords::file_name = "/tmp/file_%5N.log",
                bl::keywords::rotation_size = 5 * 1024 * 1024,
                bl::keywords::time_based_rotation = bl_snk::file::rotation_at_time_point(12, 0, 0)
            );
text_backend->auto_flush(true);

log_factory_libA.CreateSink< bl_snk::text_file_backend >(text_backend);
log_factory_libB.CreateSink< bl_snk::text_file_backend >(text_backend);

Где под капотом CreateSink в основном делает:

using sink_t = bl_snk::synchronous_sink< bl_snk::text_file_backend >;
boost::shared_ptr<sink_t> lib_sink = boost::make_shared<sink_t>(text_backend);

person Maxter    schedule 08.12.2017    source источник


Ответы (1)


Я планировал накормить все соответствующие приемники одним и тем же бэкэндом; такой подход правильный?

Нет, это неправильно. Интерфейсы приемника реализуют синхронизацию потоков, поэтому, если несколько интерфейсов совместно используют серверную часть, серверная часть становится незащищенной.

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

person Andrey Semashev    schedule 09.12.2017
comment
Я понимаю. Мое обоснование этого подхода заключалось в том, что я хотел отделить журналы от плагина от журналов в основном приложении, освобождая основное приложение от необходимости знать подробности регистрации внутри плагина (например, каналы или, что наиболее важно, уровни серьезности журнала - которые, по моему мнению, могут быть разными и уникальными для плагина). - person Maxter; 11.12.2017