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

问题描述:

我正在使用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%" 
); 
} 

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

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

每次调用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(); 
} 

其次,这是创建并返回由add_file_logtext_file_backend有旋转日志文件的能力。如果您只想在程序的某些位置切换日志文件,这就是您可能要查找的内容。您可以将名为keywords::rotation_size的已命名参数添加到add_file_log调用中,它们将用于在后端设置自动文件旋转。您也可以通过在接收器后端调用text_file_backend::rotate_file来手动旋转文件。

void RotateLogFile() { 
    g_file_sink->locked_backend()->rotate_file(); 
} 

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