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

时间:2017-12-08 12:57:57

标签: c++ boost boost-log

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

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

现在真正的问题:想要收集某些特定“地方”的所有应用程序日志(例如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);

1 个答案:

答案 0 :(得分:1)

  

我打算用相同的后端喂养所有相关的水槽;这种方法是否正确?

不,这不正确。 Sink前端实现线程同步,因此如果多个前端共享后端,后端将变得不受保护。

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