0

私の Java サーバーでは、java.util.logging フレームワークを使用して、プログラムの状態をログに記録します。ログ ファイルが大きくなりすぎないように、次の Filehandler コンストラクターを使用します。

//import java.util.logging.FileHandler;
//import java.util.logging.Logger;

FileHandler fileLog = new FileHandler("log%g.txt", 10 * 1024*1014, 2, false);
logger.addHandler(fileLog);

私の理解では、ファイル サイズが 10MB を超えるまで、ロガーは log0.txt に書き込みます。次に、log1.txt に変更します。ファイル サイズが 10 MB を超えると、log0.txt に戻ります。これは正しいですか?

したがって、この場合、古いログ ファイルは上書きされます。これを回避するために、ロガーが出力ファイルを変更したときに Methode (管理者に電子メールを送信する) を呼び出したいと考えています。

void callOnOutputfileChanged() {
  sendEmailToAdmin();
}

このイベントにどのように反応するか考えていますか?

4

1 に答える 1

1

ファイル サイズが 10 MB を超えると、log0.txt に戻ります。これは正しいですか?

通常の場合、はい。FileHandler がファイルのロックを取得できない場合は、他のルールが適用されます。

したがって、この場合、古いログ ファイルは上書きされます。これを回避するために、ロガーが出力ファイルを変更したときに Methode (管理者に電子メールを送信する) を呼び出したいと考えています。

現在、FileHandler がいつ回転するかをリッスンする唯一の方法は、FileHandler を拡張し、保護された void setOutputStream(OutputStream)メソッドをオーバーライドすることです。ローテーション中、FileHandler レベルは OFF に設定されます。クラスの例を次に示します。

    public class ListeningFileHandler extends FileHandler {

        public ListeningFileHandler() throws IOException {
            super();
        }

        @Override
        protected synchronized void setOutputStream(OutputStream out) throws SecurityException {
            super.setOutputStream(out);
            if (Level.OFF.equals(super.getLevel())) { //Rotating...
                sendEmailToAdmin();
            }
        }

        private void sendEmailToAdmin() {
            //...
        }
    }

ローテーションを防ぎたい場合は、目標を変更する必要があります。制限を離れてカウントを増やすか、カウントを下げて制限を増やす必要があります。

于 2015-02-21T20:16:01.513 に答える