Criando um App4 Log4j2 personalizado
1. Introdução
Neste tutorial, aprenderemos como criar um appender Log4j2 personalizado. Se você está procurando a introdução ao Log4j2, dê uma olhada emthis article.
Log4j2 ships with a lot of built-in appenders que pode ser usado para vários fins, como registro em um arquivo, em um banco de dados, em um soquete ou em um banco de dados NoSQL.
No entanto, pode haver a necessidade de um appender personalizado, dependendo das demandas do aplicativo.
O Log4j2 é uma versão atualizada do Log4j e possui melhorias significativas em relação ao Log4j. Portanto, usaremos a estrutura Log4j2 para demonstrar a criação de um anexador personalizado.
2. Configuração do Maven
Precisamos da dependêncialog4j-core em nossopom.xml para começar:
org.apache.logging.log4j
log4j-core
2.11.0
A versão mais recentelog4j-core pode ser encontradahere.
3. Appender personalizado
Existem duas maneiras pelas quais podemos implementar nosso aplicativo personalizado. First is by implementing the Appender interface and the second is by extending the AbstractAppender class. O segundo método fornece uma maneira simples de implementar nosso próprio anexador personalizado e é isso que usaremos.
Para este exemplo, vamos criar umMapAppender. Vamos capturar os eventos de log e armazená-los em umConcurrentHashMap com o carimbo de data / hora para a chave.
É assim que criamos oMapAppender:
@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);
}
}
Anotamos a classe com a anotação@Plugin annotation que indica que nosso appender é um plugin.
Oname do plugin significa o nome que forneceríamos na configuração para usar este appender. Ocategory especifica a categoria na qual colocamos o plugin. OelementType é um appender.
Também precisamos de um método de fábrica que crie o appender. Nosso métodocreateAppender serve a esse propósito e é anotado com a anotação@PluginFactory.
Aqui, inicializamos nosso appender chamando o construtor protegido e passamoslayout como nulo, pois não iremos fornecer nenhum layout no arquivo de configuração e esperamos que a estrutura resolva o layout padrão.
A seguir,we’ve overridden the append method which has the actual logic of handling the LogEvent. Em nosso caso, o métodoappend colocaLogEvent em nossoeventMap.
4. Configuração
Agora que temos nosso localMapAppender in, precisamos de um arquivo de configuraçãolo4j2.xml para usar este appender para nosso registro.
Aqui está como definimos a seção de configuração em nosso arquivolog4j2.xml:
Observe que o atributo packages deve fazer referência ao pacote que contém seu aplicativo personalizado.
Em seguida, na seção do nosso appender, definimos o appender. Aqui está como adicionamos nosso aplicativo personalizado à lista de anexos na configuração:
A última parte é realmente usar o appender em nossa seção Loggers. Para nossa implementação, usamosMapAppender como um logger raiz e o definimos na seção raiz.
Veja como é feito:
5. Manipulação de erros
Para lidar com erros ao registrar o evento, podemos usar o métodoerror herdado deAbstractAppender.
Por exemplo, se não quisermos registrar eventos que tenham um nível de registro inferior ao deWARN.
Podemos usar o métodoerror deAbstractAppender para registrar uma mensagem de erro. Veja como isso é feito em nossa aula:
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);
}
Observe como nosso métodoappend mudou agora. Verificamos o nível deevent’s para ser maior do queWARNe retornamos mais cedo se for menor queWARN.
6. Conclusão
Neste artigo, vimos como implementar um anexador personalizado para Log4j2.
Embora existam muitas maneiras embutidas de registrar nossos dados usando os anexadores fornecidos pelo Log4j2, também temos ferramentas nesta estrutura que nos permitem criar nosso próprio anexador de acordo com as necessidades do nosso aplicativo.
Como de costume, o exemplo pode ser encontradoover on Github.