1. 序章

このチュートリアルでは、カスタムLog4j2アペンダーの作成について学習します。 Log4j2の紹介をお探しの場合は、この記事をご覧ください。

Log4j2には、ファイル、データベース、ソケット、NoSQLデータベースへのログ記録など、さまざまな目的に使用できる多くの組み込みアペンダーが付属しています。

ただし、アプリケーションの要求に応じて、カスタムアペンダーが必要になる場合があります。

Log4j2はLog4jのアップグレードバージョンであり、Log4jよりも大幅に改善されています。 したがって、Log4j2フレームワークを使用して、カスタムアペンダーの作成を示します。

2. Mavenのセットアップ

まず、pom.xmllog4j-core依存関係が必要です。

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.0</version>
</dependency>

最新バージョンlog4j-coreここにあります。

3. カスタムアペンダー

カスタムアペンダーを実装する方法は2つあります。 1つ目はAppenderインターフェイスを実装することで、2つ目はAbstractAppenderクラスを拡張することです。 2つ目のメソッドは、独自のカスタムアペンダーを実装する簡単な方法を提供します。

この例では、MapAppenderを作成します。 ログイベントをキャプチャし、キーのタイムスタンプとともに Concurrent HashMapに保存します。

MapAppender:の作成方法は次のとおりです。

@Plugin(
  name = "MapAppender", 
  category = Core.CATEGORY_NAME, 
  elementType = Appender.ELEMENT_TYPE)
public class MapAppender extends AbstractAppender {

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

    protected MapAppender(String name, Filter filter) {
        super(name, filter, null);
    }

    @PluginFactory
    public static MapAppender createAppender(
      @PluginAttribute("name") String name, 
      @PluginElement("Filter") Filter filter) {
        return new MapAppender(name, filter);
    }

    @Override
    public void append(LogEvent event) {
        eventMap.put(Instant.now().toString(), event);
    }
}

クラスに@Pluginアノテーションを付けました。これは、アペンダーがプラグインであることを示しています。

プラグインのnameは、このアペンダーを使用するための構成で提供する名前を示します。 category は、プラグインを配置するカテゴリを指定します。 elementTypeはアペンダーです。

アペンダーを作成するファクトリメソッドも必要です。 createAppender メソッドはこの目的を果たし、@PluginFactoryアノテーションが付けられています。

ここでは、保護されたコンストラクターを呼び出してアペンダーを初期化し、 layout をnullとして渡します。これは、構成ファイルにレイアウトを提供せず、フレームワークがデフォルトのレイアウトを解決することを期待しているためです。

次に、LogEventを処理する実際のロジックを持つappendメソッドをオーバーライドしました。 私たちの場合、 追加メソッドは LogEvent 私たちに eventMap。 

4. 構成

MapAppender が配置されたので、このアペンダーをロギングに使用するには、lo4j2.xml構成ファイルが必要です。

log4j2.xmlファイルで構成セクションを定義する方法は次のとおりです。

<Configuration xmlns:xi="http://www.w3.org/2001/XInclude" packages="com.baeldung" status="WARN">

packages属性は、カスタムアペンダーを含むパッケージを参照する必要があることに注意してください。

次に、アペンダーのセクションで、アペンダーを定義します。 構成内のアペンダーのリストにカスタムアペンダーを追加する方法は次のとおりです。

<MapAppender name="MapAppender" />

最後の部分は、ロガーセクションのアペンダーを実際に使用することです。 この実装では、 MapAppender をルートロガーとして使用し、ルートセクションで定義します。

方法は次のとおりです。

<Root level="DEBUG">
    <AppenderRef ref="MapAppender" />
</Root>

5. エラー処理

イベントのログ記録中にエラーを処理するには、AbstractAppender。から継承されたerrorメソッドを使用できます。

たとえば、ログレベルがWARN。よりも低いイベントをログに記録したくない場合です。

AbstractAppendererrorメソッドを使用して、エラーメッセージをログに記録できます。 これが私たちのクラスでどのように行われるかです:

public void append(LogEvent event) {
    if (event.getLevel().isLessSpecificThan(Level.WARN)) {
        error("Unable to log less than WARN level.");
        return;
    }
    eventMap.put(Instant.now().toString(), event);
}

appendメソッドがどのように変更されたかを確認してください。 イベントのレベルがWARNより大きいかどうかを確認し、WARNより小さい場合は早期に戻ります。

6. 結論

この記事では、Log4j2のカスタムアペンダーを実装する方法を見てきました。

Log4j2が提供するアペンダーを使用してデータをログに記録する方法は数多く組み込まれていますが、このフレームワークには、アプリケーションのニーズに応じて独自のアペンダーを作成できるツールもあります。

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