11

コンテクスト:

log4jを使用して、監査関連のログを特定のログファイル(たとえば、audit.log)に書き込みたいと思います。データの損失に耐えたくないので、syslogappender(udpベース)を使用したくありません。さらに、ファイルが特定のサイズに達したときに、logrotateを使用してaudit.logをローテーションしています。

問題:

私が遭遇しているのは、logrotateがファイルaudit.logをaudit.log.1にローテーションすると、log4jはaudit.logへの書き込み以外にaudit.log.1への書き込みを続けるということです。

考えられるアプローチ:

  1. logrotateを使用する以外にrollingfileappenderを使用してログローテーションを実行できることはわかっているので、rollingfileappenderがファイルをロールすると、面倒なことなく新しいファイルに切り替わります。しかし、rollingfileappenderを使用できない理由は、logrotateのポストローテーション機能を使用して、ローテーションが発生した後に、rollingfileappenderでは提供できないスクリプトをトリガーするためです。

  2. 私が考えることができるもう1つの必死の方法は、log4jのカスタマイズされたアペンダーを自分で作成して、ログファイル(audit.log.1)を閉じ、ファイルが回転したことを検出したときに新しいアペンダー(audit.log)を開くことです。

  3. ExternallyRolledFileAppenderを使用したことはありませんが、logrotate postrotateを使用して信号をExternallyRolledFileAppenderに送信し、log4jにファイルが回転していることを認識させて、新しいファイルへの書き込みを開始できる場合はどうでしょうか。

質問:

そのようないくつかのアペンダーがすでに発明/書かれているのだろうか?または、これを解決する他のオプションがありますか?

4

1 に答える 1

6

logrotatecopytruncateオプションをチェックしてください。あなたのケースに役立つかもしれません:

copytruncate
       Truncate the original log file to zero size  in  place
       after  creating  a copy, instead of moving the old log 
       file and optionally creating a new  one.   It  can  be  
       used  when  some  program  cannot be told to close its 
       logfile and thus might continue writing (appending) to
       the  previous  log file forever.  Note that there is a
       very small time slice between  copying  the  file  and 
       truncating  it,  so  some  logging data might be lost.
       When this option is used, the create option will  have
       no effect, as the old log file stays in place
于 2012-05-24T12:58:09.163 に答える