boost :: log是否可以在每次应用程序运行时旋转文件?

时间:2018-03-27 12:11:24

标签: c++ logging boost boost-log boost-logging

让我们考虑来自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存档?感谢。

1 个答案:

答案 0 :(得分:2)

您可能不希望在启动时旋转文件(这意味着关闭当前文件并打开一个新文件),而是生成一个不与文件冲突的文件名由您的申请的先前版本保留。

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

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

管理轮换文件,包括scan_for_files功能,记录在案here