2017-01-01 8 views
0

私はboost :: logを使ってファイルとコンソールに同時にログインします。boost :: log closeログファイルを開き、新しいファイルを開く

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_logによって作成され、返された第二に、text_file_backendは、ログファイルを回転させる能力を持っています。プログラムの特定のポイントでログファイルを切り替えるだけなら、これはおそらくあなたが探しているものです。 keywords::rotation_sizeなどの名前付きパラメータをadd_file_logコールに追加できます。これらのパラメータは、バックエンドでの自動ファイルローテーションの設定に使用されます。また、シンクバックエンドでtext_file_backend::rotate_fileを呼び出すことによって手動でファイルを回転することもできます。

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

この場合、シンクをコアから取り外す必要はありません。ファイルがローテーションされた後もアクティブのままです。

関連する問題