Boost::Log 使用具有多个接收器的相同后端的安全性

Boost::Log Safety of using the same backend with multiple sinks

我的问题不是真正的问题,而是一个正确用法的问题。

前言:我正在使用 boost::log 作为日志工具,我正在开发一些库,这些库将在不同的应用程序之间共享,并且可能需要不同级别的日志记录. 我想出了一个设置,其中我有(或可能有)每个库的特定通道和严重性级别,以及一种使使用库的应用程序能够为库创建 proper/desired 接收器的工厂, 而无需了解图书馆渠道和严重级别的详细信息。

现在是真正的问题:我打算将所有应用程序的日志收集到某些特定的 "places"(例如 stdout,或一些与严重性相关的文件)中具有相同后端的所有相关接收器; 这种方法是否正确?我在文档中没有发现任何反对它的内容,但也没有显示此用法的示例...

例如:

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);

I was planning to feed all the relevant sinks with the same backend; is this approach correct?

不,这是不正确的。接收器前端实现线程同步,因此如果多个前端共享一个后端,则后端将不受保护。

通常没有理由为单个后端使用多个前端。如果要将多个通道定向到单个文件或控制台,则无需创建多个接收器。每个 file/console 应该创建一个接收器;您可以通过更新其过滤器来控制将哪些通道路由到接收器。