如何使用 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 已达到总数的限制 space,因此每次翻转都会用 Logs.19.txt 覆盖 Logs.20.txt 文件,依此类推。

因此最旧的文件不断重命名为下一个索引,直到达到最大总日志 space 限制,然后才被覆盖。

问题

  1. 是否有可以支持的文件日志记录后端配置?
  2. 如果没有,我如何为此自定义后端?
  3. 此外,请向我指出任何 documentation/tutorial (Boost.Log 文档除外) 与库结构相关的 Boost 日志记录和 class 级交互,如果知道的话。

Is there a configuration for file logging backend that can support it?

不,Boost.Log 不支持这个。主要原因是保持最新日志文件的计数器值为 0 需要在每次轮换时重命名 N 次文件,其中 N 是先前轮换文件的数量。除了性能影响之外,这还增加了文件系统操作期间失败的可能性(例如,如果进程在轮换期间打开其中一个文件,这将导致 Windows 上的重命名错误)。

If not, how can I customise the backend for this?

您不需要自定义接收器后端,但您必须编写一个自定义文件收集器。您必须在接收器后端实现 collector interface, most importantly the store_file method, which should perform all filesystem activity, including renaming files and removing old files. This method will be called when the sink backend rotates the log file. You can set your file collector by calling set_file_collector