我正在为我的应用程序的本机编写的日志记录框架引入替代方法。现有日志记录以生成文件的方式编写,因此当前正在写入的文件名为 “ logs.txt” ,而经过翻转的文件名为< strong> “ 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
文件,依此类推。
因此,最旧的文件将不断重命名为下一个索引,直到达到最大总日志空间限制,然后才被覆盖。
答案 0 :(得分:0)
是否存在可以支持它的文件记录后端配置?
否,Boost.Log不支持此功能。主要原因是,要使最新的日志文件的计数器值均为0,则每次循环需要重命名N个文件,其中N是先前循环的文件数。除了性能方面的问题外,这还增加了文件系统操作期间失败的机会(例如,如果进程在旋转期间打开其中一个文件,这将在Windows上导致重命名错误)。
如果没有,我如何为此定制后端?
您不需要自定义接收器后端,但是必须编写一个自定义文件收集器。您必须实现collector
接口,最重要的是store_file
方法,该方法应该执行所有文件系统活动,包括重命名文件和删除旧文件。当接收器后端旋转日志文件时,将调用此方法。您可以通过在接收器后端调用set_file_collector
来设置文件收集器。