c++ 如何在Boost日志中实现线程安全

kmbjn2e3  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(181)

我有一个多线程应用程序,我想使用boost-log。我用的是boost 1.81
要记录我使用宏
BOOST_LOG_TRIVIAL
在这里我配置boost-log:

logging::register_simple_formatter_factory<logging::trivial::severity_level, char>("Severity");
logging::register_simple_filter_factory<logging::trivial::severity_level, char>("Severity");

std::ifstream file("log.config");
logging::init_from_stream(file);
logging::add_common_attributes();

下面是log.config的内容:

[Core]
DisableLogging=false
#Filter="%Severity% > info"

# Sink settings sections
[Sinks.File]
# Sink destination type
Destination=TextFile

# Sink-specific filter. Optional, by default no filter is applied.
Filter="%Severity% > trace"

# Formatter string. Optional, by default only log record message text is written.
Format="[%TimeStamp%] %Message%"

FileName="Log_%d%m%y_%3N.log"
Target="logs"

RotationSize= 5242880 # 5MB

# The flag shows whether the sink should be asynchronous
Asynchronous=false

# Enables automatic stream flush after each log record.
AutoFlush=true

输出日志文件包含损坏的行或截断/重叠的行,如下所示:

我怎样才能实现一个日志文件没有这些问题?
我假设boost会处理并发,有办法启用它吗?

hfwmuf9z

hfwmuf9z1#

我试图用一个最小的可重复的例子来重现我的问题。我无法重现该问题。
深入查看我的代码,我发现我的单例实现有一个bug,boost日志配置被执行了两次:

logging::register_simple_formatter_factory<logging::trivial::severity_level, char>("Severity");
logging::register_simple_filter_factory<logging::trivial::severity_level, char>("Severity");

std::ifstream file("log.config");
logging::init_from_stream(file);
logging::add_common_attributes();

双升压配置产生上述误差。我添加了这个作为答案,以指导那些在日志文件中有损坏/重叠/截断行的相同错误的人。

相关问题