2017-01-01 469 views
0

我正在使用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」我缺少,或手動告訴它停止記錄到原始日誌並移動到下一個?

回答

1

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

請注意,在這種情況下,您不必從內核中移除接收器;它在文件旋轉後保持活動狀態。