2

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

4

1 回答 1

3

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

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

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

此处记录了管理旋转文件(包括scan_for_files功能)。

于 2018-03-27T20:03:11.210 回答