微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Boost log 'text_file_backend' - 按需旋转文件

如何解决Boost log 'text_file_backend' - 按需旋转文件

我想涵盖我的进程崩溃或无法正常关闭且日志未轮换的情况。

2个具体案例:

  • 如果我为我的日志文件使用了一个固定名称(例如 keywords::file_name = "app.log")并且该进程没有管理在关闭时轮换日志(假设它崩溃了),那么当它重新启动时,它将覆盖我的app.log 来自崩溃的实例。这很糟糕,因为该日志特别有趣。
  • 如果我为我的日志文件使用自定义名称(例如 keywords::file_name = "app_%Y%m%d_%H%M%s_%5N.log")并且该进程未能在关闭时轮换日志,那么当它重新启动时,它将创建一个新的 app_YMD_HMS_5N.log 而将之前的日志文件保留在同一文件夹 (~/logs) 中,而不是将其移动到历史记录 (bl::keywords::target = "~/logs/history")。这也很糟糕,因为 logs 文件夹变得凌乱,并且因为旋转文件夹 e.i.目标 (logs/history) 受到 max_size 约束的监控,因此 logs 文件夹可能会不受控制地增长。

经过调查后,我得出的结论是:

  • 为日志文件指定一个固定名称(例如 keywords::file_name = "app.log"
  • 为轮换的日志文件设置一个带有日期和索引的自定义名称,以便能够拥有多个日志文件(例如 keywords::target_file_name = "app_%Y%m%d_%H%M%s_%5N.log"
  • 打开日志文件以进行追加 (keywords::open_mode = std::ios_base::app)。
  • 在打开日志文件后立即调用 rotate_file() 上的 text_file_backend 以旋转 non empty app.log(如果之前的应用实例未能正确关闭记录器)。

问题是 rotate_file() 没有效果。当我调用它时,日志文件不会旋转。
我做错了什么吗?

这是我设置文件同步的方法

// File log
auto file_sink = bl::add_file_log(bl::keywords::target          = "history",bl::keywords::file_name       = "app.log"),bl::keywords::target_file_name= "app_%Y%m%d_%H%M%s_%5N.log"),bl::keywords::rotation_size   = 25 * 1024 * 1024,bl::keywords::max_size        = 250 * 1024 * 1024,bl::keywords::auto_flush      = true,bl::keywords::open_mode       = std::ios_base::app,bl::keywords::max_files       = 10);

file_sink->set_formatter(log_fmt);
file_sink->set_filter(bl::trivial::severity >= level);

// In case the prevIoUs log was not rotated on shutdown (it's not empty),rotate it Now
file_sink->locked_backend()->rotate_file(); // NOT DOING ANYTHING!

为了一致性,我还想在关闭时禁用轮换 (​​keywords::enable_final_rotation = false) 以便只在启动时轮换日志文件,而不管我的应用程序如何终止(崩溃、kill -9、正确关闭... ) 但要做到这一点,我首先需要能够在启动时轮换日志。

解决方法

正如 Andrey Semashev 提到的,为了使 rotate_file() 工作,您首先需要记录一些东西,以便实际打开日志文件。

考虑到这一点,我在记录器初始化期间(在应用程序启动时)执行以下操作:

  • 在关闭时禁用旋转 (keywords::enable_final_rotation = false) - 对于我们没有崩溃的情况,我们不会进行额外的空文件旋转(在所有情况下旋转是在启动或点击collector limits)。
  • 打开文件进行追加 (bl::keywords::open_mode = std::ios_base::app)
  • 记录诸如“按需旋转记录器”之类的内容
  • 调用 rotate_file() - 这将在日志文件打开后进行轮换。

外观如下:

 // File log
auto file_sink
    = bl::add_file_log(bl::keywords::target                = "history",bl::keywords::file_name             = "app.log",bl::keywords::target_file_name      = "app_%Y%m%d_%H%M%S_%5N.log",bl::keywords::rotation_size         = 10 * 1024 * 1024,bl::keywords::open_mode             = std::ios_base::app,// Open for append and immediately rotate
                       bl::keywords::enable_final_rotation = false // Rotate only on startup to cover also the crash / kill cases
    );

// Log something so the logger opens the file
BOOST_LOG_TRIVIAL(info) << "Rotating logs on startup";

// Do the rotation on demand
file_sink->locked_backend()->rotate_file();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。