You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过配置文件实现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;
}

关键说明

  1. 压缩触发时机:compress_log_file函数会在日志文件达到轮转阈值、完成文件切换后自动调用,将原日志压缩为.gz格式并清理原文件。
  2. 配置统一性:代码直接读取配置文件中的MaxSize和MaxFiles参数,避免配置与代码逻辑脱节。
  3. 版本兼容:Boost 1.57的text_file_backend和file_collectorAPI与后续版本无核心差异,上述代码可直接编译运行。

内容的提问来源于stack exchange,提问作者dgolan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:01:10