Uso de logging en Spring Boot

logging-spring-boot

logging-spring-boot


Uno de los factores más importantes cuando desarrollamos nuestra aplicación son sus logs así como los diferentes niveles de logs y como desactivarlos. En este artículo vamos a ver como hacer uso de Logging en Spring Boot.

Configuración de Logging en Spring Boot

Spring Boot es un framework que nos proporciona de base prácticamente todas las funcionalidades y utilidades que necesitamos, para el uso de logging la única librería que necesitamos es Apache Commons Logging, la cual es proporcionada a partir de Spring Boot 2.

Por defecto el nivel de logging de Spring es a Info, por lo que si necesitamos otro nivel de log tendremos que configurarlo.

Uso de Logging por defecto con Logback

Spring Boot usa Commons Logging y tiene configurado Logback como el logging por defecto que usa Spring Boot con sus starters. Y sino la configuración por defecto nos la proporciona  Java Util LoggingLog4J2, and Logback. Todas las configuraciones muestran los logging por consola.

Vamos a ver un ejemplo haciendo uso de Logging en una aplicación de Spring Boot, en la que añadimos un log en el arranque.

Formato de Logging

Spring Boot expone el siguiente formato de logging por defecto:

2022-03-15 10:57:51.112  INFO 45469 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/7.0.52

Estos son los atributos de logging en Spring Boot:

  • Fecha y Hora: Precisión de milisegundo.
  • Nivel de Log: ERRORWARNINFODEBUG, or TRACE.
  • Process ID.
  • --- seperador para distinguir el log.
  • Nombre de Thread : Encerrado entre corchetes []
  • Nombre del log: Nombre de la clase
  • Mensaje

Configuración de nivel de Logging con Spring Boot

Spring Boot nos permite configurar los diferentes niveles de log de diferentes formas:

Una de las maneras que podemos usar para evitar tener que tocar dentro de nuestro servicio o microservicio es a través de la consola de arranque del servicio:

mvn spring-boot:run 
  -Dspring-boot.run.arguments=--logging.level.org.springframework=TRACE,--logging.level.com.refactorizando=TRACE

Podemos cambiar el nivel de log de manera permanente usando el fichero de logging de la configuración.

Por defecto Spring Boot usa Logback, en nuestro fichero podemos definir nuestro nivel de logging.

<logger name="org.springframework" level="INFO" />
<logger name="com.refactorizando" level="INFO" />

En el caso en el que trabajemos con ficheros de propiedades (.yml o .properties), podemos realizar diferentes configuraciones y establecer en las propiedades diferentes niveles de log, en función del paquete:

logging:
  level:
    com:
      logs:
        microservices: ERROR

Logging con Lombok

Una de las maneras más fáciles que tenemos de hacer logging actualmente y más rápida es através de Lombok.

Aunque previamente necesitamos añadir su dependencia maven:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>${version}</version>
    <scope>provided</scope>
</dependency>

Una vez hemos añadido su dependencia podremos hacer uso de logging en nuestros servicios disminuyendo el boilerplate de nuestro código.

Uso de @Slf4j y @CommonsLog

Gracias a Lombok y Slf4j y CommonsLog podemos añadir logging a nuestras clases de Spring tan solo con añadir estas anotaciones.

Al hacer uso de Slf4j estaremos importando la librería, org.slf4j.logger y al hacer uso de CommonsLog haremos uso de org.apache.commons.logging.Log.

Con ambas anotaciones obtenemos el mismo comportamiento, además Lombok nos proporciona ya la definición de log, es decir, con solo poner log.info (debug etc), tenemos nuestro log.

Uso de logging con Lombok | Uso de logging en Spring Boot
Uso de logging con Lombok

Uso de Log4j2 con Spring Boot y Lombok

Si queremos hacer uso de Log4j2 en nuestros servicios en lugar de @Slf4j o @CommongLog, podemos añadirlo con la anotación @Log4j2 en lugar de las anotaciones anteriores sin ningún cambio más.

Configuración del logging con Logback

Aunque Spring Boot nos da mucha configuración y en muchas ocasiones será suficiente con eso, en otras necesitaremos algo de configuración.

Por ejemplo para mostrar los logs por consola con un formato diferente y también volcarlos a un fichero, o mostrar diferente nivel de log.

Cuando centralizamos la configuración de logging en un único fichero evitamos llenar nuestro application.yml con más configuraciones.

Cuando añadimos un fichero de logback en nuestra carpeta resource, lo cargará sobre la configuración por defecto. Spring recomienda añadir el sufijo spring, es decir, logback-spring.xml. Haciendo uso de las siguinetes archivos se cargará sobre la de por defecto:

  • logback-spring.xml
  • logback.xml
  • logback-spring.groovy
  • logback.groovy

Un ejemplo de fichero de logback puede ser el siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <property name="LOGS" value="./logs" />

  <appender name="Console"
    class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>
        %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
      </Pattern>
    </layout>
  </appender>

  <!-- LOG everything at INFO level -->
  <root level="info">
    <appender-ref ref="Console" />
  </root>

  <logger name="com.refactorizando" level="trace" additivity="false">
    <appender-ref ref="Console" />
  </logger>

</configuration>
Logs con Logback
Logs con Logback

En la captura de pantalla anterior podemos ver como se ha sobreescrito la configuración con nuestro fichero de logback de manera que se añade un color amarillo al log.

Configuración de Logging con Log4j2

Apache Commons Logging es el núcleo de logging y Logback (que hemos visto en el apartado anterior) es la implementación. Y para hacer uso de otras bibliotecas se facilita cualquier cambio. Sin embargo, para usar cualquier librería que no sea Logback, es necesario excluirla de nuestras dependencias.

Por ejemplo si queremos añadir log4j2 como una dependencia necesitamos excluir el starter logging de spring:

<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>

Y al igual que hemos hecho con logback lo incluimos en la carpeta resources, para sobreescribir la configuración por defecto, para ello añadimos uno de los siguientes ficheros:

  • log4j2-spring.xml
  • log4j2.xml

Por ejemplo:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout
        pattern="%style{%d{ISO8601}}{black} %highlight{%-5level }[%style{%t}{bright,blue}] %style{%C{1.}}{bright,yellow}: %msg%n%throwable" />
    </Console>
  </Appenders>

  <Loggers>
    <!-- LOG everything at INFO level -->
    <Root level="info">
      <AppenderRef ref="Console" />
    </Root>

    <Logger name="com.refactorizando" level="trace"></Logger>
  </Loggers>

</Configuration>

Hemos hecho uso de Log4J sobre la implementación de SLF4J con una configuración propia para tener una customización propia que sobreescriba la de por defecto de Spring.

Conclusión

En esta entrada sobre uso de logging en Spring Boot hemos visto las diferentes maneras que tenemos de mostrar logs de nuestras aplicaciones, viendo desde las configuraciones por defecto a las facilidades de uso de Lombok.

Si quieres ver un ejemplo de configuración en Spring Boot, puedes echar un ojo aquí.

Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!


Deja una respuesta

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