boost :: log关闭日志文件并打开一个新文件

Aur*_*ius 2 c++ boost boost-log

我正在使用boost :: log同时登录到文件和控制台。初始化如下:

void Init() {
logging::core::get()->set_filter
    (
        // set logging level to one of trace, debug, info, warning, error, fatal
        logging::trivial::severity >= logging::trivial::trace
    );
logging::add_common_attributes(); // enables timestamps and such
logging::add_file_log
    (
        keywords::file_name     = logfile + "_%N.log",
        keywords::rotation_size = 1024 * 1024 * 50, // 50MB log file max
        //       keywords::format = "[%TimeStamp%]: %Message%"
        keywords::format        = "%Message% #[%TimeStamp%]"
    );

logging::add_console_log(std::cout,
                         keywords::format = "%Message%"
);
}
Run Code Online (Sandbox Code Playgroud)

在程序的某些时候,我想手动更改日志文件。我可以在上面的代码中更改“ logfile”字符串,然后再次调用该Init(),但是它将继续写入旧的日志文件并启动新的日志文件,并开始将控制台日志的输出加倍。

我缺少某种对应的“ remove_file_log”,还是手动告诉它停止记录到原始日志并移至下一个日志?

And*_*hev 5

每次调用都会add_file_log在日志记录核心中注册一个新的文件接收器,这将导致同时写入多个文件。现有的水槽不更换。根据您实际想要执行的操作,可以执行多项操作。

首先,如果您查看add_file_log引用,您会注意到它返回了指向创建的接收器的指针。您可以将该指针传递给core::remove_sink您希望停止使用该接收器的时间。接收器销毁后,将关闭其使用的日志文件。

typedef sinks::synchronous_sink< sinks::text_file_backend > sink_t;
boost::shared_ptr< sink_t > g_file_sink;

void Init() {
    // ...
    g_file_sink = logging::add_file_log
    (
        keywords::file_name     = logfile + "_%N.log",
        keywords::rotation_size = 1024 * 1024 * 50, // 50MB log file max
        keywords::format        = "%Message% #[%TimeStamp%]"
    );

    // ...
}

void StopFileLogging() {
    logging::core::get()->remove_sink(g_file_sink);
    g_file_sink.reset();
}
Run Code Online (Sandbox Code Playgroud)

其次,由text_file_backend创建和返回的add_file_log可以旋转日志文件。如果您只想在程序的某些位置切换日志文件,那可能就是您想要的。您可以将命名参数添加keywords::rotation_size到该add_file_log调用中,这些参数将用于在后端设置自动文件轮换。您也可以通过调用text_file_backend::rotate_file接收器后端手动旋转文件。

void RotateLogFile() {
    g_file_sink->locked_backend()->rotate_file();
}
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,您不必从核心中删除接收器。旋转文件后,它保持活动状态。