如何创建附加到现有文件但也有旋转的text_file_backend? 我这样做,但每次运行程序时都会创建一个新文件。
App.log
App.log00000
App.log00001
等等......
boost::log::add_file_log
(
boost::log::keywords::auto_flush = true,
boost::log::keywords::target = "Log",
boost::log::keywords::file_name = "App.log", // file name pattern eg: keywords::file_name = "app%m%d%Y_%H%M%S_%5N.log",
boost::log::keywords::open_mode = std::ios::out | std::ios::app, // append mode
boost::log::keywords::rotation_size = 10 * 1024 * 1024, // rotate files every 10 MBytes
boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), // ...or at midnight
.....
我还能尝试别的吗?
谢谢
答案 0 :(得分:1)
使用target
参数,您将目标目录配置为与最初写入日志文件的目录(file_name
参数)不同,这意味着在轮换时文件将被移动。由于文件名不包含可以区分文件的占位符,因此新文件与之前轮换中目标目录中保留的文件冲突,并附加计数器后缀以避免冲突。
追加仅在接收器后端打开由file_name
标识的文件时才有效,并且该文件已存在。它不会使文件在旋转时附加到目标目录中的现有文件,这是不可能的。因为在你的情况下,旋转每次都会移动文件,所以不会发生追加。
为了使附加和旋转都能工作,你必须确保(a)接收器后端写入的先前文件保留在同一目录中,并且与新接收器尝试打开的名称相同,并且(b)文件名包含一些占位符,以便在每次轮换时生成新的文件名。这些是相互矛盾的要求,但有些配置可以满足它们。例如,您可以将目标目录配置为与后端写入日志文件的位置相同,文件名包含日期并在午夜每天轮换。
boost::log::add_file_log
(
boost::log::keywords::auto_flush = true,
boost::log::keywords::target = "Log",
boost::log::keywords::file_name = "Log/App_%Y%m%d.log",
boost::log::keywords::open_mode = std::ios::out | std::ios::app,
boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0)
);
请注意,文件计数器和文件大小的旋转在附加时效果不佳,因为它们往往违反我列出的要求之一。
答案 1 :(得分:0)
您需要将 keywords::enable_final_rotation
设置为 false(例如 here),以便在您的进程退出时不轮换。
这样,下次您的进程启动时,如果由于大小/时间规则而未旋转文件,它将附加到该文件中。
此外,我建议使用模式(例如 keywords::target_file_name
)设置 "App_%Y%m%d_%H%M%S_%5N.log"
,以便旋转的文件具有不同的名称(在这种情况下包含日期和索引)。
如果您不这样做,您将拥有最多 1 个旋转文件 (Log/App.log),这些文件将被下一个旋转文件覆盖。