如何通过配置文件实现Boost Log的日志轮转与压缩?
Boost Log配置文件实现日志轮转+压缩解决方案
Boost Log的配置文件接口默认并未直接提供日志压缩的配置项,要同时实现轮转与压缩,需要结合自定义文件收集器和压缩回调函数,将配置文件的轮转参数与代码中的压缩逻辑结合起来。以下是具体实现步骤:
一、调整配置文件
首先修正原配置中的冲突:Destination=Console与FileName无法同时生效(控制台输出不需要文件路径),需改为Destination=File。同时可补充轮转的约束参数,示例配置如下:
# Logging core settings section [Core] DisableLogging=false Filter="%Severity% > 3" # Sink settings sections [Sinks.MyFileSink] Destination=File Format="<%TimeStamp%> - %Message%" FileName="logs/app_%N.log" RotationSize=104857600 # 单文件轮转阈值:100MB MaxFiles=10 # 最多保留10个轮转文件 MaxSize=1048576000 # 日志总容量上限:1GB
二、代码中集成压缩逻辑
在加载配置文件的基础上,手动创建文件收集器并绑定压缩回调,将其关联到目标sink。以下是兼容Boost 1.57的代码示例:
#include <boost/log/core.hpp> #include <boost/log/trivial.hpp> #include <boost/log/expressions.hpp> #include <boost/log/utility/setup/file.hpp> #include <boost/log/utility/setup/common_attributes.hpp> #include <boost/log/utility/setup/settings.hpp> #include <boost/log/utility/setup/from_settings.hpp> #include <boost/log/sinks/text_file_backend.hpp> #include <boost/iostreams/filtering_stream.hpp> #include <boost/iostreams/filter/gzip.hpp> #include <fstream> // 轮转后日志文件的压缩回调 void compress_log_file(const boost::filesystem::path& src_path) { boost::filesystem::path dest_path = src_path; dest_path += ".gz"; std::ifstream src(src_path.string(), std::ios_base::binary); std::ofstream dest(dest_path.string(), std::ios_base::binary); boost::iostreams::filtering_ostream out; out.push(boost::iostreams::gzip_compressor()); out.push(dest); out << src.rdbuf(); // 删除原未压缩文件 boost::filesystem::remove(src_path); } int main() { // 初始化通用日志属性(如时间戳) boost::log::add_common_attributes(); // 加载配置文件 boost::log::settings settings = boost::log::parse_settings("logging.conf"); // 基于配置初始化日志核心与sinks boost::log::init_from_settings(settings); // 找到目标文件sink,绑定压缩逻辑 auto core = boost::log::core::get(); auto sinks = core->get_sinks(); for (auto& sink : sinks) { auto file_sink = boost::dynamic_pointer_cast<boost::log::sinks::text_file_backend>(sink->locked_backend()); if (file_sink) { // 创建文件收集器,复用配置文件中的轮转参数 auto collector = boost::log::sinks::file::make_collector( boost::log::sinks::file::max_size(settings["Sinks.MyFileSink"]["MaxSize"]), boost::log::sinks::file::max_files(settings["Sinks.MyFileSink"]["MaxFiles"]) ); // 设置轮转完成后的压缩回调 collector->set_compression_callback(&compress_log_file); // 将收集器绑定到文件sink,生效轮转与压缩规则 file_sink->set_file_collector(collector); file_sink->scan_for_files(); // 扫描已存在的日志文件,纳入收集器管理 } } // 测试日志输出 BOOST_LOG_TRIVIAL(info) << "Test log message with rotation and compression"; return 0; }
关键说明
- 压缩触发时机:
compress_log_file函数会在日志文件达到轮转阈值、完成文件切换后自动调用,将原日志压缩为.gz格式并清理原文件。 - 配置统一性:代码直接读取配置文件中的
MaxSize和MaxFiles参数,避免配置与代码逻辑脱节。 - 版本兼容:Boost 1.57的
text_file_backend和file_collectorAPI与后续版本无核心差异,上述代码可直接编译运行。
内容的提问来源于stack exchange,提问作者dgolan
相关产品推荐
相关产品推荐

