c++ - Boost.Log - 如何使用附加和旋转配置 text_file_backend

标签 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
    .....
    

还有什么我可以尝试的吗?

谢谢

最佳答案

使用 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/

相关文章:

c++ - 指向成员函数的指针

c++ - 无法理解赋值运算符的重载

c++ - Visual Studio 10中使用/MT或/MD构建dll

python - Selenium 独立服务器日志级别

C++ 绑定(bind)成员函数的快速方法

c++ - 对于语言环境敏感的函数,传递 std::locale 或所需的方面对象更常见吗?

database - 如何登录Oracle数据库?

java - 仅登录到文件警告消息

c++ - 在逗号上使用多参数模板类型扼流圈的 Boost Fusion 结构

boost - 使用boost库时,我应该链接到mt还是普通版本的库?