Integración completa de Log4j2 con Spring Boot

Frameworks de registro comunes

  • java.util.logging: El marco de registro nativo de Java introducido en la versión 1.4.
  • Log4j: Proyecto de Apache ampliamente utilizado, aunque ya no se mantiene activamente.
  • LogBack: Sucesor modernizado de Log4j.
  • Log4j2: Una reeescritura completa que ofrece mejoras significativas.

SLF4J como fachada de registro

SLF4J (Simple Logging Facade for Java) proporciona una capa de abstracción para diferentes implementaciones de registro, permitiendo cambiar el marco subyacente sin modificar el código de la aplicación.

Ventajas de usar Log4j2

  • Menor pérdida de datos comparado con otros marcos.
  • Uso de la biblioteca Disruptor para un rendimiento superior en entornos multihilo.
  • Reducción de bloqueos gracias al uso avanzado de concurrencia en Java 1.5.
  • Mejor desempeño en modo síncrono y asíncrono frente a alternativas como Logback.

Pasos para integrar Log4j2 con Spring Boot

Spring Boot usa Logback por defecto. Para usar Log4j2, es necesaroi excluir Logback y añadir la dependencia de Log4j2:

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 <exclusions>
   <exclusion>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-logging</artifactId>
   </exclusion>
 </exclusions>
</dependency>

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

Configuración del archivo de registro

Se puede usar un archivo XML personalizado. Si se usa el nombre por defecto log4j2-spring.xml, no se requiere configuración adicional en application.yml.

Ejemplo de archivo de configuración

<?xml version="1.0" encoding="UTF-8"?>
<configuration monitorInterval="5">
 <properties>
   <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
   <property name="FILE_PATH" value="/ruta/a/logs" />
   <property name="FILE_NAME" value="mi-aplicacion" />
 </properties>

 <appenders>
   <console name="Consola" target="SYSTEM_OUT">
     <PatternLayout pattern="${LOG_PATTERN}" />
     <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
   </console>

   <file name="Archivo" fileName="${FILE_PATH}/prueba.log" append="false">
     <PatternLayout pattern="${LOG_PATTERN}" />
   </file>

   <RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
     <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
     <PatternLayout pattern="${LOG_PATTERN}" />
     <Policies>
       <TimeBasedTriggeringPolicy interval="1"/>
       <SizeBasedTriggeringPolicy size="10MB"/>
     </Policies>
     <DefaultRolloverStrategy max="15"/>
   </RollingFile>

   <RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
     <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
     <PatternLayout pattern="${LOG_PATTERN}" />
     <Policies>
       <TimeBasedTriggeringPolicy interval="1"/>
       <SizeBasedTriggeringPolicy size="10MB"/>
     </Policies>
     <DefaultRolloverStrategy max="15"/>
   </RollingFile>

   <RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
     <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
     <PatternLayout pattern="${LOG_PATTERN}" />
     <Policies>
       <TimeBasedTriggeringPolicy interval="1"/>
       <SizeBasedTriggeringPolicy size="10MB"/>
     </Policies>
     <DefaultRolloverStrategy max="15"/>
   </RollingFile>
 </appenders>

 <loggers>
   <logger name="org.mybatis" level="info" additivity="false">
     <AppenderRef ref="Consola"/>
   </logger>
   <Logger name="org.springframework" level="info" additivity="false">
     <AppenderRef ref="Consola"/>
   </Logger>

   <root level="info">
     <appender-ref ref="Consola"/>
     <appender-ref ref="Archivo"/>
     <appender-ref ref="RollingFileInfo"/>
     <appender-ref ref="RollingFileWarn"/>
     <appender-ref ref="RollingFileError"/>
   </root>
 </loggers>
</configuration>

Niveles de registro

  • trace: Detalles de seguimiento del flujo del programa.
  • debug: Información útil para depuración.
  • info: Mensajes informativos sobre el estado de la aplicación.
  • warn: Advertencias que no impiden la ejecución normal.
  • error: Errores que afectan la funcionalidad.
  • fatal: Errores críticos que detienen la ejecución.

Ejemplo de uso básico

public class EjemploRegistro {
 private static final Logger logger = LoggerFactory.getLogger(EjemploRegistro.class);

 public static void main(String[] args) {
   logger.error("Ha ocurrido un error grave");
   logger.warn("Advertencia: recurso bajo");
   logger.info("Aplicación iniciada correctamente");
 }
}

Etiquetas: spring-boot log4j2 java logging slf4j

Publicado el 10-3 22:18