如何创建附加到现有文件但也有旋转的 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 .....
还有什么我可以尝试的吗?
谢谢
最佳答案
使用 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)
);
请注意,文件计数器和文件大小轮换不适用于附加,因为它们往往会违反我列出的要求之一。
关于c++ - Boost.Log - 如何使用附加和旋转配置 text_file_backend,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49558240/