アプリケーションコードはシンプルに保つ必要があります。つまり、ロギングの失敗を心配せず、ロギングの失敗をロガー自体に委任する必要があります。
したがって、アプリケーションコードは次のようになります。
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.
}
}
}