Creazione di un appender Log4j2 personalizzato

1. Introduzione

In questo tutorial impareremo a creare un appender Log4j2 personalizzato. Se stai cercando l'introduzione a Log4j2, dai un'occhiata a questo articolo.

Log4j2 viene fornito con molti appender incorporati che possono essere utilizzati per vari scopi come la registrazione in un file, in un database, in un socket o in un database NoSQL.

Tuttavia, potrebbe essere necessario un appender personalizzato a seconda delle richieste dell'applicazione.

Log4j2 è una versione aggiornata di Log4j e presenta miglioramenti significativi rispetto a Log4j. Quindi, utilizzeremo il framework Log4j2 per dimostrare la creazione di un appender personalizzato.

2. Installazione di Maven

Avremo bisogno della dipendenza log4j-core nel nostro pom.xml per iniziare con:

 org.apache.logging.log4j log4j-core 2.11.0 

L'ultima versione di log4j-core può essere trovata qui.

3. Appender personalizzato

Ci sono due modi in cui possiamo implementare il nostro appender personalizzato. Il primo è l'implementazione dell'interfaccia Appender e il secondo è l'estensione della classe AbstractAppender . Il secondo metodo fornisce un modo semplice per implementare il nostro appender personalizzato ed è quello che useremo.

Per questo esempio, creeremo un MapAppender . Cattureremo gli eventi di log e li memorizzeremo in una HashMap concorrente con il timestamp per la chiave.

Ecco come creiamo il 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); } }

Abbiamo annotato la classe con l' annotazione @Plugin che indica che il nostro appender è un plugin.

Il nome del plug-in indica il nome che forniremo nella configurazione per utilizzare questo appender. La categoria specifica quella categoria in cui collochiamo il plugin. L'elementType è appender.

Abbiamo anche bisogno di un metodo di fabbrica che creerà l'appender. Il nostro metodo createAppender serve a questo scopo ed è annotato con l' annotazione @PluginFactory .

Qui, inizializziamo il nostro appender chiamando il costruttore protetto e passiamo il layout come null poiché non forniremo alcun layout nel file di configurazione e ci aspettiamo che il framework risolva il layout predefinito.

Successivamente, abbiamo sovrascritto il metodo append che ha la logica effettiva di gestione del LogEvent . Nel nostro caso, il metodo append inserisce LogEvent nella nostra eventMap.

4. Configurazione

Ora che abbiamo installato il nostro MapAppender , abbiamo bisogno di un file di configurazione lo4j2.xml per utilizzare questo appender per la nostra registrazione.

Ecco come definiamo la sezione di configurazione nel nostro file log4j2.xml :

Tieni presente che l'attributo packages deve fare riferimento al pacchetto che contiene l'appender personalizzato.

Successivamente, nella sezione del nostro appender, definiamo l'appender. Ecco come aggiungiamo il nostro appender personalizzato all'elenco di appenders nella configurazione:

L'ultima parte consiste nell'usare effettivamente l'appender nella nostra sezione Logger. Per la nostra implementazione, usiamo MapAppender come root logger e lo definiamo nella sezione root.

Ecco come si fa:

5. Gestione degli errori

Per gestire gli errori durante la registrazione dell'evento possiamo utilizzare il metodo di errore ereditato da AbstractAppender.

Ad esempio, se non vogliamo registrare eventi che hanno un livello di registrazione inferiore a quello di WARN.

Possiamo utilizzare il metodo di errore di AbstractAppender per registrare un messaggio di errore. Ecco come si fa nella nostra classe:

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

Osserva come è cambiato il nostro metodo di aggiunta ora. Controlliamo che il livello dell'evento sia maggiore di WARN e torniamo presto se è inferiore a WARN .

6. Conclusione

In questo articolo, abbiamo visto come implementare un appender personalizzato per Log4j2.

Sebbene ci siano molti modi integrati per registrare i nostri dati utilizzando gli allegati forniti da Log4j2, abbiamo anche strumenti in questo framework che ci consentono di creare il nostro appender secondo le esigenze della nostra applicazione.

Come al solito, l'esempio può essere trovato su Github.