¿Cómo personalizar log4j2 RollingFileAppender?
Utilizamos log4j 1.2.x para iniciar sesión en nuestro producto y estamos buscando migrar a log4j 2.x en un futuro próximo. Una de las funciones que hemos implementado es registrar la información del sistema y otros parámetros de importación y hormiga en cada nuevo archivo de registro que se genera. La forma en que implementamos en log4j 1.2.x es que hemos ampliadoRollingFileAppender
clase de log4j y han anulado elrollOver()
método, a continuación se muestra el fragmento de parte de la implementación
@Override
public void rollOver() {
super.rollOver(); //We are not modifying it's default functionality but as soon as rollOver happens we apply our logic
//
// Logic to log required system properties and important parameters.
//
}
Ahora, como queremos migrar a log4j2, estamos buscando una nueva solución para lograr la misma funcionalidad. Pero como veo el código fuente de log4j2, es muy diferente del código fuente anterior. losRollingFileAppender
la clase no contienerollover()
método ya que se ha movido aRollingManagerhelper
y se ha establecido enprivate
también.
Desarrollar un nuevo paquete completo y extender / implementar algunas clases abstractas / auxiliares de log4j2 es una de las posibles soluciones para nosotros, pero eso requeriría mucha codificación / copia ya que no modificamos quéRollingFileAppender
más bien solo necesitamos una pequeña extensión. ¿Hay una solución simple para ello?
ACTUALIZAR
Creé una búsqueda personalizada de acuerdo con la sugerencia en las respuestas y a continuación es cómo la creé;
@Plugin(name = "property", category = StrLookup.CATEGORY)
public class CustomLookup extends AbstractLookup {
private static AtomicLong aLong = new AtomicLong(0);
@Override
public String lookup(LogEvent event, String key) {
if (aLong.getAndIncrement() == 0) {
return "this was first call";
}
if (key.equalsIgnoreCase("customKey")) {
return getCustomHeader();
} else {
return "non existing key";
}
}
private static String getCustomHeader() {
// Implementation of custom header
return "custom header string";
}}
Pero esto no funcionó como se mencionó; esto siempre imprimethis was first call
en el encabezado También intenté poner breakoint en el primeroif
condición y lo que noté fue que solo se llama una vez. Entonces, lo que temo es que la clase customLookup solo se inicializa en el inicio cuando log4j2 está inicializando sus propiedades desde la configuración xml. No sé cómo podría implementar esta clase de búsqueda personalizada.
ACTUALIZACIÓN 2
Después de la implementación anterior, lo probé de una manera un poco diferente, que es la siguiente;
private static AtomicLong aLong = new AtomicLong(0);
@Override
public String lookup(LogEvent event, String key) {
return getCustomHeader(key);
}
private static String getCustomHeader(final String key) {
if (aLong.getAndIncrement() == 0) {
return "this was first call";
}
if (key.equalsIgnoreCase("customKey")) {
// Implementation for customKey
return "This is custom header";
} else {
return "non existing key";
}
}
Pero esto también hace lo mismo. log4j2 crea los encabezados en mientras se inicializa desde su archivo de configuración xml y luego usa los encabezados de la memoria. losreturn
valor de anuladolookup()
El método no se puede cambiar dinámicamente ya que solo se llama durante la inicialización. Cualquier otra ayuda sería muy apreciada.