如何配置Boost::log使其写入日志时不覆盖原有文件内容?
boost::log 避免日志覆盖及多进程共享配置方案
默认调用logging::add_file_log("sample.log")会覆盖文件的原因是,boost::log 默认使用std::ios_base::trunc截断模式打开文件,每次初始化都会清空原有内容,按以下配置即可解决:
1. 核心配置代码
#include <boost/log/trivial.hpp> #include <boost/log/utility/setup/file.hpp> #include <fstream> namespace logging = boost::log; namespace keywords = boost::log::keywords; // 初始化文件日志sink auto log_sink = logging::add_file_log( keywords::file_name = "sample.log", // 核心配置1:指定追加模式,不覆盖原有文件内容 keywords::open_mode = std::ios_base::app, // 核心配置2:多进程写入时每次写操作加锁,避免内容乱序/损坏 keywords::file_lock_mode = logging::file_lock_mode::lock_per_write, // 核心配置3:关闭进程退出时的自动日志轮转,避免多进程操作文件冲突 keywords::enable_final_rotation = false ); // 保留原有日志级别过滤逻辑 log_sink->set_filter( logging::trivial::severity >= logging::trivial::info ); // 写入测试 BOOST_LOG_TRIVIAL(info) << "log content";
2. 额外注意事项
- 封装到dll时,不要重复调用
add_file_log:建议在dll暴露的初始化接口中仅执行一次日志初始化逻辑,避免重复注册sink导致同一条日志多次写入 - 如果需要启用日志按大小/时间轮转,不建议多进程共用同一份日志文件,可改为每个进程写独立日志文件事后合并,或者用单进程统一收集所有进程的日志再写入,避免多进程操作轮转文件出现冲突
lock_per_write模式会有小幅性能损耗,如果对日志写入性能要求较高,可在dll中实现本地缓冲队列批量刷盘,降低加锁开销
内容的提问来源于stack exchange,提问作者Zhang
相关产品推荐
相关产品推荐

