1.はじめに

このチュートリアルでは、カスタムLog4j2アペンダーの作成について学びます。 Log4j2の概要をお探しの場合は、https://www.baeldung.com/log4j2-appenders-layouts-filters[この記事]をご覧ください。

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

ただし、アプリケーションの要求によっては、カスタムアペンダが必要になることがあります。

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

[[”setup”]]

2. Mavenのセットアップ

まず、

pom.xml



log4j-core

依存関係が必要になります。

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

最新バージョン

log4j-core

はhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.apache.logging.log4j%22%20AND%20a%3A%22log4j-にありますcore%22[ここ]。

[[”custom__appender”]]

3.カスタムアペンダ

カスタムアペンダを実装する方法は2つあります。 ** 1つ目は

Appender

インタフェースを実装すること、2つ目は

__AbstractAppender

__classを拡張することです。

この例では、

MapAppender

を作成します。ログイベントをキャプチャして、キーのタイムスタンプを付けて

__ConcurrentHashMap

__に保存します。

__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

__annotationでクラスに注釈を付けました。

プラグインの

name

は、このアペンダを使用するために設定で提供する名前を表します。

category

はプラグインを配置するカテゴリを指定します。

elementType

はアペンダです。

アペンダを作成するファクトリメソッドも必要です。私たちの

createAppender

メソッドはこの目的を果たし、

@ PluginFactory

アノテーションが付けられています。

ここでは、保護されたコンストラクタを呼び出してアペンダを初期化し、configファイルにレイアウトを提供しないので

layout

をnullとして渡します。フレームワークはデフォルトのレイアウトを解決するものとします。

次に、

LogEvent

** を処理する実際のロジックを持つ

append

メソッドをオーバーライドしました。私たちの場合、

append

メソッドは

LogEvent



eventMapに入れます。

[[”configuration”]]

4.設定


__MapAppenderが代わりにあるので、ロギングにこのアペンダーを使用するには


lo4j2.xml

__configurationファイルが必要です。


log4j2.xml

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

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

packages属性は、カスタムアペンダを含むパッケージを参照する必要があります。

次に、アペンダのセクションで、アペンダを定義します。これが、設定のアペンダのリストにカスタムアペンダを追加する方法です。

<MapAppender name="MapAppender"/>

最後の部分は、実際に私たちのLoggersセクションでアペンダを使うことです。

この実装では、

MapAppender

をルートロガーとして使用し、それをルートセクションで定義します。

やり方は次のとおりです。

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

5.エラー処理

イベントをログに記録しながらエラーを処理するために、

AbstractAppender.

から継承した

error

メソッドを使用することができます。

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

エラーメッセージをログに記録するには、

AbstractAppender



__error

__メソッドを使用できます。これが私たちのクラスでのやり方です。

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

よりも小さい場合は早めに戻ります。

[[”conclusion”]]

6.まとめ

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

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

いつものように、例はhttps://github.com/eugenp/tutorials/tree/master/logging-modules/log4j2[over on Github]にあります。