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

Boost Log日志目录异常:先写入二进制目录再移至目标目录

Boost Log 滚动日志先写入二进制目录再移动的问题分析与解决

问题本质

你观察到的现象并非异常,而是Boost Log滚动文件Sink的设计预期行为:

  • keywords::file_name 指定的是日志文件在临时工作目录(默认是进程当前工作目录,即你的二进制目录)的生成路径和命名格式
  • 文件收集器(file_collector)的作用是在日志滚动触发时,将已写满的旧日志文件移动到keywords::target指定的归档目录
  • 新的日志文件会继续在工作目录创建,直到下一次滚动触发后被移动

解决方案

如果希望避免在二进制目录生成临时日志文件,有两种可行方案:

方案1:将临时日志文件直接指定到目标目录

修改text_file_backend的file_name参数,直接指向target目录下的临时文件名,这样日志文件从一开始就会在目标目录创建,滚动时也无需跨目录移动:

pSinkBackend = boost::make_shared<sinks::text_file_backend>
(
    keywords::file_name = "c:\\TestProjects\\BoostLogMoveLogsfile\\build\\Debug\\logs\\LogFile%3N.log",
    keywords::rotation_size = 16*1024,
    keywords::auto_flush = true,
    keywords::enable_final_rotation = true
);

这种方式下,文件收集器依然会管理归档文件的数量和大小限制,只是不再需要跨目录移动文件。

方案2:指定单独的临时工作目录

如果需要区分临时文件和归档文件的存储位置,可以通过keywords::temp_directory参数为text_file_backend指定专门的临时目录,避免占用二进制目录:

pSinkBackend = boost::make_shared<sinks::text_file_backend>
(
    keywords::file_name = "LogFile%3N.log",
    keywords::temp_directory = "c:\\TestProjects\\BoostLogMoveLogsfile\\build\\Debug\\temp_logs",
    keywords::rotation_size = 16*1024,
    keywords::auto_flush = true,
    keywords::enable_final_rotation = true
);

注意:需要确保temp_directory指定的目录已存在,Boost Log不会自动创建该目录。

额外说明

  • 如果你希望归档后的日志文件有不同的命名格式,可以在make_collector时添加keywords::target_file_name参数,例如:
    sinks::file::make_collector
    (
        keywords::target = "c:\\TestProjects\\BoostLogMoveLogsfile\\build\\Debug\\logs",
        keywords::target_file_name = "ArchivedLog%3N.log",
        keywords::max_size = 150*1024*1024, 
        keywords::min_free_space = 512*1024*1024, 
        keywords::max_files = 60
    )
    
  • 你代码中调用scan_for_files()的逻辑是正确的,该函数会让收集器扫描目标目录中已存在的日志文件,纳入大小和数量统计,无需修改。

内容的提问来源于stack exchange,提问作者Maxi Paxi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:27:17