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
相关产品推荐
相关产品推荐

