Saltar al contenido

¿Cómo personalizar log4j2 RollingFileAppender?

Solución:

Una alternativa al uso de las búsquedas integradas es crear una búsqueda personalizada. Esto se puede lograr en unas pocas líneas de código con un complemento log4j2. Su búsqueda personalizada luego proporciona el valor exacto que desea mostrar en el encabezado del archivo en cada rollover.

El código del complemento se vería así:

package com.mycompany;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.AbstractLookup;
import org.apache.logging.log4j.core.lookup.StrLookup;

/**
 * Looks up keys from a class SomeClass which has access to all
 * information you want to provide in the log file header at rollover.
 */
@Plugin(name = "setu", category = StrLookup.CATEGORY)
public class SetuLookup extends AbstractLookup {

    /**
     * Looks up the value of the specified key by invoking a
     * static method on SomeClass.
     *
     * @param event The current LogEvent (ignored by this StrLookup).
     * @param key  the key to be looked up, may be null
     * @return The value of the specified key.
     */
    @Override
    public String lookup(final LogEvent event, final String key) {
        return com.mycompany.SomeClass.getValue(key);
    }
}

Luego, en su configuración, puede usar el encabezado del diseño del patrón para generar esto en cada rollover:

<RollingFile name="RollingFile" fileName="logs/app.log"
             filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}.log.gz">

  <!-- use custom lookups to access arbitrary internal system info -->
  <PatternLayout header="${setu:key1} ${setu:key2}">
    <Pattern>%d %m%n</Pattern>
  </PatternLayout>
  <Policies>
    <TimeBasedTriggeringPolicy />
  </Policies>
</RollingFile>

El manual de log4j2 contiene detalles sobre la creación / implementación de complementos personalizados. Breve resumen:

La forma más sencilla es construir su jar con Maven; esto hará que el procesador de anotaciones log4j2 produzca un archivo de índice binario en el jar para que log4j2 pueda encontrar rápidamente su complemento.

La alternativa es especificar el nombre del paquete de su clase de complemento en la configuración de log4j2.xml packages atributo:

<Configuration status="warn" packages="com.mycompany">
  ...

ACTUALIZACIÓN: Tenga en cuenta que en su implementación de búsqueda puede ser tan creativo como sea necesario. Por ejemplo:

package com.mycompany;

public class SomeClass {
    private static AtomicLong count = new AtomicLong(0);

    public static String getValue(final String key) {
        if (count.getAndIncrement() == 0) { // is this the first call?
            return ""; // don't output a value at system startup
        }
        if ("FULL".equals(key)) {
            // returns info to shown on rollover, nicely formatted
            return fullyFormattedHeader();
        }
        return singleValue(key);
    }
    ....
}

Esto se puede lograr con la configuración. Puede utilizar el encabezado del diseño del patrón para generar información. Esto se incluirá en cada reinversión.

<RollingFile name="RollingFile" fileName="logs/app.log"
             filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}.log.gz">

  <!-- use built-in lookups for system info or system properties -->
  <PatternLayout header="${java:runtime} - ${java:vm} - ${java:os}">
    <Pattern>%d %m%n</Pattern>
  </PatternLayout>
  <Policies>
    <TimeBasedTriggeringPolicy />
  </Policies>
</RollingFile>
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *