c++ - 如何使用 Boost V2 1.70 日志库在第一个索引处保留最新的日志文件名(例如 logtrail01.txt)?
问题描述
我正在为我的应用程序的本机编写的日志框架引入一个替代品。现有日志记录以生成文件的方式编写,使得当前写入的文件名为“logs.txt”,翻转的文件名为“Logs.N.txt”,其中“Logs.1.txt” "是"logs.txt"之后的最新版本。如何通过 Boost V2 日志记录实现相同的行为?
尝试使用 Boost 日志记录,因为它为多个接收器提供了良好的支持,因为我现在必须将我的日志定位到 3 个位置: a)本地日志文件, b)云上的堆栈驱动程序,以及 c)作为单独托管的 syslog 服务器容器
我希望当前文件为“logs.txt”的原因是,除其他外,它允许一个tail -F logs.txt
正在运行的系统上。
我找到了一个片段,它可以旋转日志并保持每个文件和总日志的大小限制。
auto strm = boost::log::add_file_log(
boost::log::keywords::file_name = "Logs.%2N.txt",
boost::log::keywords::open_mode = std::ios_base::app,
boost::log::keywords::rotation_size = 5 * 1024, // Max filesize
boost::log::keywords::auto_flush = true
);
auto bkend = strm->locked_backend();
bkend->set_file_collector(boost::log::sinks::file::make_collector(
boost::log::keywords::target = "./", // log file destination
boost::log::keywords::max_size = 100 * 1024, //Max total size
boost::log::keywords::min_free_space = 100000
));
bkend->scan_for_files(boost::log::sinks::file::scan_method::scan_matching, true);
行为
当前的文件生成模式是:
Logs.01.txt <--- Oldest file
Logs.02.txt
.
.
.
Logs.19.txt
Logs.20.txt <--- File being written to
随着记录的继续,它将成为
Logs.41.txt <--- Oldest file
Logs.42.txt
.
.
.
Logs.59.txt
Logs.60.txt <--- File being written to
索引一直在滚动(所以它超出了所需的 2 位索引)
Logs.131.txt <--- Oldest file
Logs.132.txt
.
.
.
Logs.149.txt
Logs.150.txt <--- File being written to
所需的文件生成模式是:
logs.txt <--- File being written to
Logs.01.txt <--- Latest rolled over file
Logs.02.txt
.
.
.
Logs.12.txt
Logs.13.txt <--- Oldest file
长到
logs.txt <--- File being written to
Logs.01.txt <--- Latest rolled over file
Logs.02.txt
.
.
.
Logs.19.txt
Logs.20.txt <--- Oldest file
&Logs.20.txt
在总空间的限制下,它会在每次翻转时不断覆盖Logs.20.txt
文件,Logs.19.txt
依此类推。
因此,最旧的文件不断重命名为下一个索引,直到达到最大总日志空间限制,然后才被覆盖。
问题
- 是否有可以支持它的文件日志记录后端配置?
- 如果没有,我该如何为此定制后端?
- 另外,如果知道的话,请向我指出任何文档/教程(除了 Boost.Log 文档)来 Boost 日志记录,这些日志记录涉及库结构和类级交互。
解决方案
是否有可以支持它的文件日志记录后端配置?
不,Boost.Log 不支持这个。主要原因是保持最新日志文件的计数器值为 0 需要在每次轮换时重命名 N 个文件,其中 N 是先前轮换文件的数量。除了性能影响之外,这增加了文件系统操作期间失败的可能性(例如,如果一个进程在轮换期间打开其中一个文件,这将导致 Windows 上的重命名错误)。
如果没有,我该如何为此定制后端?
您不需要自定义接收器后端,但您必须编写自定义文件收集器。您必须实现collector
接口,最重要的是store_file
方法,它应该执行所有文件系统活动,包括重命名文件和删除旧文件。当 sink 后端旋转日志文件时,将调用此方法。您可以通过调用set_file_collector
接收器后端来设置文件收集器。
推荐阅读
- r - R中的随机抽样:限制重复次数
- go - 提供动态长度响应数据
- google-chrome - 为什么无法下载状态码 4XX 和 5XX 的文件
- c# - 如何使用图表 C# 编程计算 id 并按日期排序
- c# - 我在哪里可以看到 C# 中预定义方法的代码?
- azure - 如何在 azure kubernetes 集群(启用 RBAC)中为服务帐户分配权限?
- python - 此正则表达式是否失败,或者我是否需要修改正则表达式以支持“可选后跟”?
- javascript - 将 HTML 元素转换为数组并处理 null
- javascript - 如何在 Reactjs 的组件状态下使用 OOP?
- arcgis - 4.x:自定义小部件之间的通信