boost::log 是否可以在每次申请时轮换文件 运行?

boost::log is it possible rotate file every time applicaion run?

让我们考虑来自 boost::log doc 的示例。

void init()
{
    logging::add_file_log
    (
        keywords::file_name = "sample_%N.log",
        keywords::rotation_size = 10 * 1024 * 1024,
        keywords::open_mode = (std::ios::out | std::ios::app),
        keywords::format = "[%TimeStamp%]: %Message%"
    );

    logging::core::get()->set_filter
    (
        logging::trivial::severity >= logging::trivial::info
    );
}

int main(int, char*[])
{
    init();
    logging::add_common_attributes();

    using namespace logging::trivial;
    src::severity_logger< severity_level > lg;

    BOOST_LOG_SEV(lg, trace) << "A trace severity message";
    return 0;
}

我第一次启动我的应用程序并创建了文件 sample_0.log。第二次启动我的应用程序时,新消息附加到同一文件 sample_0.log。我希望 sample_1.log 由应用程序创建。我想在每次应用程序运行时轮换日志文件。我如何使用 boost::log 将其存档?谢谢。

您可能不希望在启动时旋转文件(这意味着关闭当前文件并打开一个新文件)而是生成一个不与之前运行应用程序留下的文件冲突。

为此需要做两件事。首先,您必须配置文件收集器,它将接收轮换的日志文件并有选择地管理它们。文件收集器在一个目标目录上运行,所有旋转的文件都存储在该目录中。您可以通过将 target 命名参数添加到 add_file_log 调用来指定该目录;这将为您的接收器创建一个文件收集器。请注意,目标目录可以与您的接收器在其中创建文件的目录相同 - 它只是意味着将旋转的日志文件移动到目标目录是 no-op.

其次,在您的应用程序启动时,需要在接收器后端调用 scan_for_files 方法。这将导致文件收集器扫描目标目录以查找可能从以前的运行中遗留下来的日志文件。如果文件名模式包含文件计数器,则调用还可以检测下一个计数器值,这正是您想要的。如果您配置了文件收集器(即添加了 target 命名参数),add_file_log 函数会自动为您执行此操作,但如果您手动创建接收器,则必须自己调用它。

管理旋转文件,包括 scan_for_files 功能,记录在案 here