You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:45:02