如何解决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 举报,一经查实,本站将立刻删除。