Erstellen eines benutzerdefinierten Log4j2-Anhangs

1. Einleitung

In diesem Tutorial erfahren Sie, wie Sie einen benutzerdefinierten Log4j2-Appender erstellen. Wenn Sie nach einer Einführung in Log4j2 suchen, lesen Sie bitte diesen Artikel.

Log4j2 wird mit vielen integrierten Appendern geliefert , 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 zunächst die log4j-core- Abhängigkeit in unserer pom.xml :

 org.apache.logging.log4j log4j-core 2.11.0 

Die neueste Version von log4j-core finden Sie hier.

3. Benutzerdefinierter Appender

Es gibt zwei Möglichkeiten, wie wir unseren benutzerdefinierten Appender implementieren können. Zum einen wird die Appender- Schnittstelle implementiert, zum anderen wird die AbstractAppender- Klasse erweitert. Die zweite Methode bietet eine einfache Möglichkeit, unseren eigenen benutzerdefinierten Appender zu implementieren, und das werden wir verwenden.

In diesem Beispiel erstellen wir einen MapAppender . Wir erfassen die Protokollereignisse und speichern sie in einer Concurrent HashMap mit dem Zeitstempel für den Schlüssel.

So erstellen wir den 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); } }

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

Der Name des Plugins gibt den Namen an, den wir in der Konfiguration für die Verwendung dieses Appenders angeben würden. Die Kategorie gibt die Kategorie an, unter der wir das Plugin platzieren. Der elementType ist appender.

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

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

Als Nächstes haben wir die Append- Methode überschrieben , die die eigentliche Logik für die Behandlung des LogEvent aufweist . In unserem Fall fügt die Append- Methode das LogEvent in unsere eventMap ein.

4. Konfiguration

Nachdem wir unseren MapAppender installiert haben, benötigen wir eine Konfigurationsdatei lo4j2.xml , um diesen Appender für unsere Protokollierung zu verwenden.

So definieren wir den Konfigurationsabschnitt in unserer Datei log4j2.xml :

Beachten Sie, dass das Paketattribut 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 Abschnitt "Logger" tatsächlich zu verwenden. Für unsere Implementierung verwenden wir MapAppender als Root-Logger und definieren ihn im Root-Bereich.

So geht's:

5. Fehlerbehandlung

Um Fehler beim Protokollieren des Ereignisses zu behandeln, können wir die von AbstractAppender geerbte Fehlermethode verwenden .

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

Wir können die Fehlermethode von AbstractAppender 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 unsere Append- Methode jetzt geändert hat. Wir überprüfen, ob das Ereignisniveau größer als WARN ist, und kehren frühzeitig zurück, wenn es weniger als WARN ist .

6. Fazit

In diesem Artikel haben wir gesehen, wie ein benutzerdefinierter Appender für Log4j2 implementiert wird.

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.

Das Beispiel ist wie immer auf Github zu finden.