0

アプリのエラーをログに記録します。ただし、何らかの理由でログ処理が失敗した場合(データベースエラー、ハードディスクに空き容量がないなど)。どうすればそれを知ることができますか?失敗したログをログに記録する方法。

例 :

try{

    this_will_throw_exception();

}catch(Exception e){

    result = Log.error(e.getMessage());
    if( result == false)
        {
         // what should I do ?
        }
}
4

3 に答える 3

2

アプリケーションコードはシンプルに保つ必要があります。つまり、ロギングの失敗を心配せず、ロギングの失敗をロガー自体に委任する必要があります。

したがって、アプリケーションコードは次のようになります。

try{
  this_will_throw_exception();
} catch(Exception e){
  Log.error(e.getMessage());
}

次に、ロガーの障害を処理する方法を見ていきます。

まず、アペンダーフェイルオーバーを提供するロギングフレームワークがたくさんあります。たとえば、log4jにFailoverAppenderがあり、プライマリが失敗した場合にセカンダリアペンダーにログを記録します。http://logging.apache.org/log4j/2.x/manual/appenders.html

何らかの理由で独自のロギングレイヤーを構築することを選択した場合、フェイルオーバーロガーを自分で構築するのにデコレーターパターンが役立つ場合があります。

public interface Logger {
  boolean error(String message);
}

public DataBaseLogger implements Logger {
  ...
}

public FileLogger implements Logger {
  ...
}

public FailoverLogger implements Logger {
  private Logger primary;
  private Logger secondary;

  public boolean error(String message) {
    boolean succeed = primary.error(message);
    if (! succeed) {
      secondary.error("Primary logger failed");
      secondary.error(message);
      // Try to restart the primary logger, however it might be difficult.
    }
  }
}
于 2012-09-03T21:32:32.887 に答える
1
try{

    this_will_throw_exception();

}catch(Exception e){

    result = Log.error(e.getMessage());
    if( result == false)
        LoggingFallback.Invoke(e);

    //important, don't hide exceptions
    throw;
}

public class LoggingFallback
{
    public static void Invoke(Exception exception)
    {
       // send an email or whatever

       // if that fails: throw  (include original exception as inner)
       throw new LoggingFailedException("Failed to log exception", exception);
    }
}

動機:

ロギングが重要な場合は、常に成功することを確認するか、失敗する場合はアプリケーションを失敗させてください。そうしないと、最終的にはログを保存していないアプリケーションになってしまいます。

また、例外を適切に処理できない場合は、再スローせずに例外をキャッチしないでください:http: //blog.gauffin.org/2010/11/do-not-catch-that-exception/

于 2012-09-03T13:57:15.727 に答える
1

私の頭に浮かぶこと:

  • ログを再作成/構成(ファイル、ストレージなど)を変更します。

  • ログを遠隔地に送信します。

  • このエラーを電子メールなどで報告するために、ユーザーにダイアログ(該当する場合)を表示します。

于 2012-09-03T12:35:35.320 に答える