Boost.Log - 如何使用append和rotate配置text_file_backend

时间:2018-03-29 14:07:03

标签: c++ logging boost

如何创建附加到现有文件但也有旋转的text_file_backend? 我这样做,但每次运行程序时都会创建一个新文件。

  1. App.log
  2. App.log00000
  3. App.log00001
  4. 等等......

    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
    .....
    
  5. 我还能尝试别的吗?

    谢谢

2 个答案:

答案 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),这些文件将被下一个旋转文件覆盖。