如何使用 Boost V2 1.70 日志记录库在第一个索引(例如 logtrail01.txt)保留最新的日志文件名?
How to keep the latest log file name at first index (e.g. logtrail01.txt), with Boost V2 1.70 logging library?
我正在引入我的应用程序的本机编写的日志记录框架的替代品。现有日志记录以生成文件的方式编写,以便当前写入的文件名为"logs.txt">,滚动的文件命名为"Logs.N.txt",其中">Logs.1.txt"是"logs.txt">之后的最新文件。如何通过 Boost V2 日志记录实现相同的行为?
尝试使用 Boost 日志记录,因为它为多个接收器提供了良好的支持,因为我现在必须将日志定向到 3 个位置:a)本地日志文件,b)云上的堆栈驱动程序,以及c)作为单独容器托管的系统日志服务器
我希望当前文件是"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.19.txt
等方式覆盖Logs.20.txt
文件。
因此,最旧的文件不断重命名为下一个索引,直到它达到最大总日志空间限制,然后被覆盖。
问题
- 是否有可以支持它的文件日志记录后端配置?
- 如果没有,我如何为此自定义后端?
- 另外,如果知道的话,请指出我的任何文档/教程(Boost.Log 文档除外)到 Boost日志记录,这些文档/教程涉及库结构和类级交互。
是否有可以支持它的文件日志记录后端配置?
不,Boost.Log 不支持此功能。主要原因是,保持最新的日志文件的计数器值为 0 需要在每次轮换时重命名 N 个文件,其中 N 是以前轮换的文件数。除了性能影响之外,这还增加了文件系统操作期间失败的可能性(例如,如果进程在轮换期间打开其中一个文件,这将导致Windows上的重命名错误)。
如果没有,我如何为此自定义后端?
无需自定义接收器后端,但必须编写自定义文件收集器。您必须实现collector
接口,最重要的是store_file
方法,该方法应执行所有文件系统活动,包括重命名文件和删除旧文件。当接收器后端轮换日志文件时,将调用此方法。可以通过在接收器后端调用set_file_collector
来设置文件收集器。
- 如何将 txt 文件中的行分隔为组件C++
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 一种在C++中读取TXT配置文件的简单方法
- 如何修复此iFile以将.txt输出到控制台
- 无法打开.txt文件
- CMakeLists.txt中的命名空间表示法
- Arduino从Txt读取整数
- 如何使用CLion在Mac上创建一个新的.txt文件
- 如何拆分文件中.txt字母并使用c ++使用数组进行扑克?
- 使用fstream对txt文件中的数字进行循环
- Visual Studio在尝试读取resource.txt文件时崩溃
- 更正 CMakeList.txt 用于谷歌测试的文件?
- 如何从txt文件中读取多个不同长度的数组?
- 在一次迭代中从 txt 文件中读取多行
- 是否可以配置提升日志刷新?
- 将生成文件转换为 CMakeLists.txt等效项
- 使用循环将多行写入.txt
- 跟踪日志中的T.11803()是什么意思?
- 如何使用 Boost V2 1.70 日志记录库在第一个索引(例如 logtrail01.txt)保留最新的日志文件名?