Erstellen eines benutzerdefinierten Log4j2-Appenders

Erstellen eines benutzerdefinierten Log4j2-Appenders

1. Einführung

In diesem Tutorial erfahren Sie, wie Sie einen benutzerdefinierten Log4j2-Appender erstellen. Wenn Sie nach einer Einführung in Log4j2 suchen, schauen Sie sich bittethis article an.

Log4j2 ships with a lot of built-in appenders, die für verschiedene Zwecke verwendet werden können, z. B. zum Protokollieren in einer Datei, in einer Datenbank, in einem Socket oder in einer NoSQL-Datenbank.

Abhängig von den Anwendungsanforderungen kann jedoch ein benutzerdefinierter Appender erforderlich sein.

Log4j2 ist eine aktualisierte Version von Log4j und weist gegenüber Log4j erhebliche Verbesserungen auf. Daher verwenden wir das Log4j2-Framework, um die Erstellung eines benutzerdefinierten Appenders zu demonstrieren.

2. Maven Setup

Wir benötigen die Abhängigkeit vonlog4j-corein unserenpom.xml, um zu beginnen mit:


    org.apache.logging.log4j
    log4j-core
    2.11.0

Die neueste Versionlog4j-core finden Sie unterhere.

3. Benutzerdefinierter Appender

Es gibt zwei Möglichkeiten, wie wir unseren benutzerdefinierten Appender implementieren können. First is by implementing the Appender interface and the second is by extending the AbstractAppender class. Die zweite Methode bietet eine einfache Möglichkeit, unseren eigenen benutzerdefinierten Appender zu implementieren, und das werden wir verwenden.

In diesem Beispiel erstellen wir einMapAppender. Wir erfassen die Protokollereignisse und speichern sie inConcurrentHashMap mit dem Zeitstempel für den Schlüssel.

So erstellen wir dieMapAppender:

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

Wir haben die Klasse mit der@Plugin -Sannotation versehen, die angibt, dass unser Appender ein Plugin ist.

Dasname des Plugins gibt den Namen an, den wir in der Konfiguration für die Verwendung dieses Appenders angeben würden. Dascategory gibt die Kategorie an, unter der wir das Plugin platzieren. DaselementType ist Appender.

Wir benötigen auch eine Factory-Methode, mit der der Appender erstellt wird. UnserecreateAppender-Methode dient diesem Zweck und wird mit der@PluginFactory-Annotation versehen.

Hier initialisieren wir unseren Appender durch Aufrufen des geschützten Konstruktors und übergebenlayout als null, da wir kein Layout in der Konfigurationsdatei bereitstellen und erwarten, dass das Framework das Standardlayout auflöst.

Als nächsteswe’ve overridden the append method which has the actual logic of handling the LogEvent. In unserem Fall setzt dieappend-Methode dieLogEvent in unsereeventMap. 

4. Aufbau

Nachdem wir unserenMapAppender in-Platz haben, benötigen wir einelo4j2.xml -Sconfiguration-Datei, um diesen Appender für unsere Protokollierung zu verwenden.

So definieren wir den Konfigurationsabschnitt in unsererlog4j2.xml-Datei:

Beachten Sie, dass das Attribut packages auf das Paket verweisen sollte, das Ihren benutzerdefinierten Appender enthält.

Als Nächstes definieren wir im Abschnitt unseres Appenders den Appender. So fügen wir unseren benutzerdefinierten Appender zur Liste der Appender in der Konfiguration hinzu:

Der letzte Teil besteht darin, den Appender in unserem Logger-Bereich zu verwenden. Für unsere Implementierung verwenden wirMapAppender als Root-Logger und definieren es im Root-Abschnitt.

So geht's:


    

5. Fehlerbehandlung

Um Fehler beim Protokollieren des Ereignisses zu behandeln, können wir die vonAbstractAppender. geerbte Methodeerror verwenden

Zum Beispiel, wenn wir keine Ereignisse protokollieren möchten, deren Protokollierungsstufe unter der vonWARN. liegt

Wir können dieerror method vonAbstractAppender verwenden, um eine Fehlermeldung zu protokollieren. So geht's in unserer Klasse:

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

Beobachten Sie, wie sich unsereappend-Methode jetzt geändert hat. Wir überprüfen, ob derevent’s-Pegel größer alsWARN ist, und kehren früh zurück, wenn er kleiner alsWARN ist.

6. Fazit

In diesem Artikel erfahren Sie, wie Sie einen benutzerdefinierten Appender für Log4j2 implementieren.

Obwohl es viele integrierte Möglichkeiten gibt, unsere Daten mithilfe der von Log4j2 bereitgestellten Appender zu protokollieren, verfügen wir in diesem Framework auch über Tools, mit denen wir unseren eigenen Appender gemäß unseren Anwendungsanforderungen erstellen können.

Wie üblich kann das Beispielover on Github gefunden werden.