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; }
}


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

そしてエラーハンドラを作成します。
こんな感じでしょうか?

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) { }
}

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

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

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

0 件のコメント:

コメントを投稿