1. 序章

この記事では、カスタムLogbackアペンダーの作成について説明します。 Javaでのログインの概要をお探しの場合は、この記事をご覧ください。

Logbackには、標準出力、ファイルシステム、またはデータベースに書き込む多くの組み込みアペンダーが付属しています。 このフレームワークのアーキテクチャの美しさは、そのモジュール性です。つまり、簡単にカスタマイズできます。

このチュートリアルでは、 logback-classic に焦点を当てます。これには、次のMaven依存関係が必要です。

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.6</version>
</dependency>

この依存関係の最新バージョンは、 MavenCentralで入手できます。

2. ベースログバックアペンダー

Logbackは、カスタムアペンダーを作成するために拡張できる基本クラスを提供します。

アペンダー すべてのアペンダーが実装する必要のある汎用インターフェイスです。 ジェネリックタイプは次のいずれかです ILoggingEvent また AccessEvent、使用しているかどうかによって異なります logback-クラシック また ログバックアクセス、 それぞれ。

カスタムアペンダーはどちらかを拡張する必要があります AppenderBase また UnsynchronizedAppenderBase, どちらも実装します アペンダー フィルタやステータスメッセージなどの機能を処理します。

AppenderBase スレッドセーフです。 UnsynchronizedAppenderBase サブクラスは、スレッドセーフを管理する責任があります。

ちょうど ConsoleAppender そしてその FileAppender 両方とも拡張 OutputStreamAppender スーパーメソッドを呼び出します setOutputStream() the カスタムアペンダーはサブクラス化する必要があります OutputStreamAppender に書き込みをしている場合 OutputStream.

3. カスタムアペンダー

カスタム例では、MapAppenderという名前のおもちゃのアペンダーを作成します。 このアペンダーは、すべてのログイベントを Concurrent HashMap に、キーのタイムスタンプとともに挿入します。 まず、 AppenderBase をサブクラス化し、ILoggingEventを汎用タイプとして使用します。

public class MapAppender extends AppenderBase<ILoggingEvent> {

    private ConcurrentMap<String, ILoggingEvent> eventMap 
      = new ConcurrentHashMap<>();

    @Override
    protected void append(ILoggingEvent event) {
        eventMap.put(System.currentTimeMillis(), event);
    }
    
    public Map<String, ILoggingEvent> getEventMap() {
        return eventMap;
    }
}

次に、 MapAppender がログイベントの受信を開始できるようにするために、構成ファイルlogback.xmlにアペンダーとして追加しましょう。

<configuration>
    <appender name="map" class="com.baeldung.logback.MapAppender"/>
    <root level="info">
        <appender-ref ref="map"/>
    </root>
</configuration>

4. プロパティの設定

Logbackは、JavaBeansイントロスペクションを使用して、アペンダーに設定されたプロパティを分析します。 カスタムアペンダーには、イントロスペクターがこれらのプロパティを見つけて設定できるようにするためのgetterメソッドとsetterメソッドが必要です。

MapAppender にプロパティを追加して、eventMapにキーのプレフィックスを付けましょう。

public class MapAppender extends AppenderBase<ILoggingEvent> {

    //...

    private String prefix;

    @Override
    protected void append(ILoggingEvent event) {
        eventMap.put(prefix + System.currentTimeMillis(), event);
    }

    public String getPrefix() {
        return prefix;
    }

    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }

    //...

}

次に、構成にプロパティを追加して、このプレフィックスを設定します。

<configuration debug="true">

    <appender name="map" class="com.baeldung.logback.MapAppender">
        <prefix>test</prefix>
    </appender>

    //...

</configuration>

5. エラー処理

カスタムアペンダーの作成および構成中のエラーを処理するために、AppenderBaseから継承されたメソッドを使用できます。

たとえば、プレフィックスプロパティがnullまたは空の文字列の場合、 MapAppenderaddError()を呼び出して、早期に戻ることができます。

public class MapAppender extends AppenderBase<ILoggingEvent> {

    //...

    @Override
    protected void append(final ILoggingEvent event) {
        if (prefix == null || "".equals(prefix)) {
            addError("Prefix is not set for MapAppender.");
            return;
        }

        eventMap.put(prefix + System.currentTimeMillis(), event);
    }

    //...

}

構成でデバッグフラグをオンにすると、プレフィックスプロパティが設定されていないことを警告するエラーがコンソールに表示されます。

<configuration debug="true">

    //...

</configuration>

6. 結論

このクイックチュートリアルでは、Logback用のカスタムアペンダーを実装する方法に焦点を当てました。

いつものように、例はGithubにあります。