カスタムLog4j2アペンダを作成する

カスタムLog4j2アペンダーの作成

1. 前書き

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

Log4j2 ships with a lot of built-in appendersは、ファイル、データベース、ソケット、またはNoSQLデータベースへのログ記録などのさまざまな目的に使用できます。

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

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

2. Mavenセットアップ

まず、pom.xmllog4j-coreの依存関係が必要になります。


    org.apache.logging.log4j
    log4j-core
    2.11.0

最新バージョンのlog4j-coreは、hereにあります。

3. カスタムアペンダー

カスタムアペンダーを実装する方法は2つあります。 First is by implementing the Appender interface and the second is by extending the AbstractAppender class. 2番目の方法は、独自のカスタムアペンダーを実装する簡単な方法を提供し、それを使用します。

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

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

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

    private ConcurrentMap 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 annotationでクラスに注釈を付けました。

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

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

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

次に、we’ve overridden the append method which has the actual logic of handling the LogEvent。 この場合、appendメソッドはLogEventeventMap. に入れます

4. 設定

MapAppender inの場所ができたので、このアペンダーをロギングに使用するには、lo4j2.xml configurationファイルが必要です。

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

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

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

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

方法は次のとおりです。


    

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メソッドがどのように変更されたかを観察します。 event’sレベルがWARNより大きいかどうかを確認し、WARNより小さい場合は早期に戻ります。

6. 結論

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

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

いつものように、例はover on Githubで見つけることができます。