2011-12-07 14 views
22

私はsinks::text_file_backendシンクを持っています。Boost.Log - ローテーションされたファイルにテキストシンクバックエンドを追加する方法

myLog001.log、myLog002.logので

に私はシンクは、最後の回転のファイルへの書き込みを維持したい - myLog002.log、その内容に追加して:私はすでにいくつかのローテーションされたログファイルを持っていると言いますそこから回転を続ける。

私はkeywords::open_mode = appendしか見つけられませんでしたが、これは既存のmyLogXファイルの上に追加されるため、大きくて読みにくいものになります。

これはBoost.Logで実行できますか?

答えて

14
機能は、テキストシンクに組み込まれていること

、およびthe documentationは、特定のサイズと時間で回転するため、ファイル名のパターンやルールを設定する例が含まれています

// The function registers file sink in the logging library 
void init_logging() 
{ 
    boost::shared_ptr<logging::core> core = logging::core::get(); 

    boost::shared_ptr<sinks::text_file_backend> backend = 
     boost::make_shared<sinks::text_file_backend>(
      // file name pattern 
      keywords::file_name = "file_%5N.log", 
      // rotate the file upon reaching 5 MiB size... 
      keywords::rotation_size = 5 * 1024 * 1024, 
      // ...or at noon, whichever comes first 
      keywords::time_based_rotation = sinks::file::rotation_at_time_point(12, 0, 0) 
     ); 

    // Wrap it into the frontend and register in the core. 
    // The backend requires synchronization in the frontend. 
    typedef sinks::synchronous_sink<sinks::text_file_backend> sink_t; 
    boost::shared_ptr<sink_t> sink(new sink_t(backend)); 

    core->add_sink(sink); 
} 

作る明らかに方法はありませんライブラリはこの設定で既存のファイルに追加されます。ドキュメント内の "回転ファイルの管理"見出しに示されているように、sinkを構築する前にbackend->scan_for_files();に電話する必要がありますが、ライブラリがクリーンアップの前に以前のログを上書きしないようにするだけです。

このトピックが2013年2月に開発メーリングリストで作成されたとき、図書館の著者は、現デザインでは作成できなかったadding support for appending would be a nontrivial changeを説明しました。

+0

私は(backend-> scan_for_filesを使用します)。私のプログラムでは、このコードを実行すると、プログラムがクラッシュしました。これについてのアイデアは? –

+0

回転は機能しますが、追加はどうですか?プログラムは、ログファイルがローテーション限界に達するまで、プログラムのその後の実行ごとに最後のログに追加する必要があります。このコードは、実行ごとに新しいログファイルを作成し、 'scan_for_files'を追加することは効果がありません。 – ixe013

+0

あなたはそうです、@ Ixe013。私は私の答えを改訂しました。 –

1

テキストファイルを使用する前にopen_modeを指定する必要があります。デフォルトでBoost.Logはオープンモードとしてstd :: ios_base :: trunc | std :: ios_base :: outを使用します。これは明らかに古いログファイルを切り捨てます。

次のパラメータを使用してインスタンスを作成することができtext_file_backend:

{ 
     boost::shared_ptr<sinks::text_file_backend> backend = 
      boost::make_shared<sinks::text_file_backend>(
       keywords::file_name = logger_file_path, 
       keywords::open_mode = std::ios_base::app|std::ios_base::out, 
       keywords::rotation_size = 5 * 1024 * 1024, 
       keywords::time_based_rotation = sinks::file::rotation_at_time_point(12, 0, 0)); 
     // Wrap it into the frontend and register in the core. 
     // The backend requires synchronization in the frontend. 
     typedef sinks::synchronous_sink<sinks::text_file_backend> sink_t; 
     boost::shared_ptr<sink_t> sink(new sink_t(backend)); 
     sink->set_formatter(logFmt); 
     core->add_sink(sink); 
    } 
関連する問題