java - example - Cómo crear un apéndice personalizado en log4j2?
log4j2 java (3)
Como se discute en este enlace: ¿Cómo crear un propio Appender en log4j?
Para crear un appender personalizado en log4j 1.x debemos extender la clase AppenderSkeleton e implementar su método de adición.
Del mismo modo, ¿cómo podemos crear un appender personalizado en log4j2 ya que no tenemos la clase AppenderSkelton para extender y todos los demás append extender la clase AppenderBase.
Parece que los complementos de complementos se escanean al inicio y no se pueden agregar durante el tiempo de ejecución. ¿Es eso cierto?
para agregar un nuevo appender mientras se está ejecutando, puede usar la propiedad monitorInterval para actualizar la configuración del registro, es decir, cada 60 segundos:
<Configuration monitorInterval="60">
Esto funciona de manera bastante diferente en log4j2 que en log4j-1.2.
En log4j2, crearía un complemento para esto. El manual tiene una explicación con un ejemplo para un appender personalizado aquí: http://logging.apache.org/log4j/2.x/manual/extending.html#Appenders
Puede ser conveniente extender org.apache.logging.log4j.core.appender.AbstractAppender
, pero esto no es obligatorio.
Cuando anota su clase de Appender personalizada con @Plugin(name="MyCustomAppender", ....
, el nombre del complemento se convierte en el nombre del elemento de configuración, por lo que una configuración con su apéndice personalizado se vería así:
<Configuration packages="com.yourcompany.yourcustomappenderpackage">
<Appenders>
<MyCustomAppender name="ABC" otherAttribute="...">
...
</Appenders>
<Loggers><Root><AppenderRef ref="ABC" /></Root></Loggers>
</Configuration>
Tenga en cuenta que el atributo de packages
en la configuración es una lista separada por comas de todos los paquetes con complementos log4j2 personalizados. Log4j2 buscará estos paquetes en el classpath para clases anotadas con @Plugin.
Aquí hay un apéndice de muestra personalizado que se imprime en la consola:
package com.yourcompany.yourcustomappenderpackage;
import java.io.Serializable;
import java.util.concurrent.locks.*;
import org.apache.logging.log4j.core.*;
import org.apache.logging.log4j.core.config.plugins.*;
import org.apache.logging.log4j.core.layout.PatternLayout;
// note: class name need not match the @Plugin name.
@Plugin(name="MyCustomAppender", category="Core", elementType="appender", printObject=true)
public final class MyCustomAppenderImpl extends AbstractAppender {
private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
private final Lock readLock = rwLock.readLock();
protected MyCustomAppenderImpl(String name, Filter filter,
Layout<? extends Serializable> layout, final boolean ignoreExceptions) {
super(name, filter, layout, ignoreExceptions);
}
// The append method is where the appender does the work.
// Given a log event, you are free to do with it what you want.
// This example demonstrates:
// 1. Concurrency: this method may be called by multiple threads concurrently
// 2. How to use layouts
// 3. Error handling
@Override
public void append(LogEvent event) {
readLock.lock();
try {
final byte[] bytes = getLayout().toByteArray(event);
System.out.write(bytes);
} catch (Exception ex) {
if (!ignoreExceptions()) {
throw new AppenderLoggingException(ex);
}
} finally {
readLock.unlock();
}
}
// Your custom appender needs to declare a factory method
// annotated with `@PluginFactory`. Log4j will parse the configuration
// and call this factory method to construct an appender instance with
// the configured attributes.
@PluginFactory
public static MyCustomAppenderImpl createAppender(
@PluginAttribute("name") String name,
@PluginElement("Layout") Layout<? extends Serializable> layout,
@PluginElement("Filter") final Filter filter,
@PluginAttribute("otherAttribute") String otherAttribute) {
if (name == null) {
LOGGER.error("No name provided for MyCustomAppenderImpl");
return null;
}
if (layout == null) {
layout = PatternLayout.createDefaultLayout();
}
return new MyCustomAppenderImpl(name, filter, layout, true);
}
}
Para más detalles sobre complementos: http://logging.apache.org/log4j/2.x/manual/plugins.html
Si el manual no es suficiente, puede ser útil mirar el código fuente de los appenders incorporados en log4j-core.
La clase AppenderSkeleton está contenida en el archivo org.apache.log4j.jar, tiene que agregar este jar como dependencia a su proyecto.