2011年3月9日水曜日

Log4jの書き込みから例外を出させる

だいぶ前からの続きです

とりあえず出来上がったソースを公開しておきます。



public class Log4jException extends RuntimeException {
private static final long serialVersionUID = 1L;
/**
* エラーコード.
* 0:一般エラー
* 1:書き込みエラー
* 2:Flushエラー
* 3:クローズエラー
* 4:ファイルオープンエラー
* 5:レイアウトが見つからない
* 6:アドレスパースエラー
*/
private int errorCodeField = -1;
private LoggingEvent eventField = null;
public Log4jException(final String message) {
super(message);
}
public Log4jException(final Throwable e) {
super(e);
}
public Log4jException(final String message, final Throwable e) {
super(message, e);
}
public Log4jException(
final String message,
final Throwable e,
final int errorCode,
final LoggingEvent event) {
super(message, e);
errorCodeField = errorCode;
eventField = event;
}
public int getErrorCode() { return errorCodeField; }
public LoggingEvent getLoggingEvent() { return eventField; }
}
public class Log4jExceptionErrorHandler implements ErrorHandler {
@Override
public void error(final String message) {
error(message, null, 0);
}
@Override
public void error(
final String message,
final Exception e,
final int errorCode) {
error(message, e, errorCode, null);
}
@Override
public void error(
final String message,
final Exception e,
final int errorCode,
final LoggingEvent event) {
if (e instanceof InterruptedIOException
|| e instanceof InterruptedException) {
Thread.currentThread().interrupt();
}
LogLog.error(message, e);
throw new Log4jException(message, e, errorCode, event);
}
@Override
public void activateOptions() { }
@Override
public void setAppender(final Appender appender) { }
@Override
public void setBackupAppender(final Appender appender) { }
@Override
public void setLogger(final Logger logger) { }
}

まずは色々取得できるように、
例外クラスを新規につくります。

注意していただきたいのは、
RuntimeExceptionを継承していることです。
後述するインターフェースの仕様で、
通常のExceptionだとスローさせることができません。

そしてエラーハンドラを作成します。
あとはlog4j.xmlのerrorHandlerタグのclass属性にて、
作成したエラーハンドラをパッケージ名も含めて記述しておけばOKです。

ログを出力する際には、
作成した例外クラスをキャッチするようにしてください。

(何の役に立つかはイミフですが、)
これでログのエラーキャッチができると思います。

0 件のコメント:

コメントを投稿