Iniciar sesión en Spring Boot con SLF4J

En este tutorial, cubriremos cómo iniciar sesión en Spring Boot con SLF4J. Cubriremos los niveles de registro, los grupos de registro y el registrador Logback predeterminado con ejemplos.

Introducción

Los registros del servidor son una parte importante del desarrollo, ya que registran las actividades o eventos que el sistema está realizando en un momento dado.

Spring Boot hace uso del Registro de Apache Commons para sus registros del sistema de forma predeterminada. Además, de forma predeterminada, puede usar cualquiera de los marcos de registro en [API SLF4J] (http://www.slf4j.org/docs.html), como Logback (que es el predeterminado), Log4J2 y Java Util. Bota de primavera.

El registro de aplicaciones es una poderosa herramienta de desarrollo que es importante para el soporte y la depuración a nivel de producción. Cada entrada de registro contiene información como la marca de tiempo, el método real al que se llama, un mensaje de registro personalizado y otra información contextual. Cada entrada de registro también incluye un identificador denominado nivel de registro.

En este tutorial, veremos cómo realizar el inicio de sesión en Spring Boot, utilizando SLF4J, así como los niveles de registro y la configuración necesaria para personalizarlos y los grupos de registro.

Mensajes de registro en Spring Boot

Para habilitar el inicio de sesión en Spring, importe Logger y LoggerFactory desde la biblioteca API org.slf4j:

1
2
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Luego, declare una constante para almacenar el servicio de registrador instanciando un registrador para la clase usando LoggerFactory:

1
private static final Logger log = LoggerFactory.getLogger(DemoService.class);

Este registro generalmente se define en la parte superior de la lista de variables globales, ya que es una constante. Al proporcionar la clase que desea registrar, está completamente configurada y lista para ser llamada con los mensajes proporcionados.

Alternativamente, puede simplemente anotar la clase con @Slf4j que generará automáticamente un registrador para la clase sin tener que declarar una constante. La anotación proporciona una variable estática llamada log que proporciona las utilidades del registrador de forma predeterminada:

1
2
3
4
5
@Slf4j
@Service
public class DemoService {
    //...
}

Nota: El identificador más común para el registrador es log, aunque también verá logger en muchos casos. Realmente, eres libre de llamarlo como quieras, pero log es breve y te evita escribir un nombre más largo debido a las llamadas frecuentes.

El inicio de sesión en Spring Boot se compone de diferentes niveles. Cada registro tiene un grado de urgencia o importancia que está asociado con un nivel de registro. Los niveles de registro se configuran en tiempo de ejecución y cada solicitud de registro verifica el nivel de registro para ver si la solicitud tiene una prioridad igual o mayor que el nivel de registro que se mostrará.

Si intenta registrar un mensaje que se considera menos importante que cierto umbral, simplemente no se registrará.

Tome este bloque, por ejemplo, con mensajes de importancia de registro en orden descendente:

1
2
3
4
5
6
7
public void logLevelDisplay () {
    logger.error("Error message");
    logger.warn("Warning message");
    logger.info("Info message");
    logger.debug("Debug message");
    logger.trace("Trace message");
}

Si no se establecen configuraciones en application.properties o en otro lugar, el nivel de registro se establecerá de forma predeterminada en INFO. Entonces, si tuviéramos que llamar al método logLevelDisplay(), arrojaría algo como esto:

1
2
3
2020-12-20 12:46:35.880  ERROR 47958 --- [nio-8080-exec-1] c.service.DemoService   : Error message
2020-12-20 12:46:52.976  WARN 47958 --- [nio-8080-exec-1 c.service.DemoService    : Warn message
2020-12-20 12:46:59.104  INFO 47958 --- [nio-8080-exec-1] c.service.DemoService    : Info message

Los mensajes DEBUG y TRACE no se mostraban porque el nivel de registro de la aplicación está establecido en INFO, que tiene un nivel de prioridad más alto que los dos.

Si el nivel de registro se configuró en ERROR, solo se mostraría el mensaje de error, ya que es el nivel de registro más alto de los 5 niveles integrados.

Esto nos lleva a un tema importante: niveles de registro, que merecen una explicación propia.

Niveles de registro en Spring Boot

El inicio de sesión en Spring Boot se compone de diferentes niveles. Cada registro tiene un grado de urgencia o importancia que está asociado con un nivel de registro. Por ejemplo, las consultas SQL de Hibernate se clasifican como DEBUG, que es un nivel de registro de baja urgencia que se invoca principalmente con fines de depuración.

Los niveles de registro permiten distinguir entre los siguientes registros de muestra:

  • Información de ‘Usuario’ actualizada con éxito: Nombre actualizado de ‘John’ a ‘Jon’.
  • NullPointerException: id de Usuario es null

El primer registro es un tipo de mensaje informativo general, mientras que el segundo registro es un mensaje NullPointerException.

Estos registros tienen diferentes niveles de urgencia, y la distinción entre ellos mediante niveles de registro es importante para filtrar los registros que no tienen que generarse según las circunstancias. Si se está produciendo un gran error, ¡no querrá que se sature con un montón de registros ‘INFO’ de bajo nivel que funcionan!

SLF4J proporciona 5 niveles de registro predeterminados en Spring boot:

ERROR: los registros de errores son problemas graves que afectan a una parte importante del sistema o que alguna parte de su aplicación no ha funcionado. Las excepciones se consideran registros de nivel ‘ERROR’. Otros ejemplos de registros de errores son las fallas de conexión a la base de datos y los errores de configuración. Los registros ERROR son el nivel de registro predeterminado más urgente en SLF4J.

WARN: los registros de advertencia se utilizan para indicar problemas potenciales que pueden causar errores y deben monitorearse en caso de que fallen. Por supuesto, el contexto de una advertencia es subjetivo para el desarrollador y la situación, por lo que los registros de advertencia pueden variar de un sistema a otro.

INFO -INFO es el nivel de registro predeterminado establecido por Spring Boot. Si no se realizan configuraciones, el nivel de registro se establece automáticamente en INFO. Estos tipos de registros son información que normalmente no se necesita, pero que es útil en situaciones como la depuración del código de producción o la determinación de cuándo se manipulan ciertos datos.

DEBUG - Los registros DEBUG incluyen información más detallada y específica que no se necesita en situaciones normales. Esto a menudo se establece como un nivel de registro cuando un desarrollador intenta rastrear en profundidad un problema o un error que es difícil de rastrear.

TRACE - TRACE es una versión más granular de DEBUG. Los registros TRACE son exhaustivos, imagine registrar cada operación que el sistema está haciendo, desde iniciar un servicio, inicializar nuevas variables y llamar a métodos.

En orden de urgencia, ERROR es el registro más urgente mientras que TRACE es el registro menos urgente. El nivel de registro predeterminado en Spring Boot es INFO cuando no se establece una configuración manual.

Configuración de niveles de registro en Spring Boot

Los niveles de registro se pueden establecer en el entorno Spring configurando sus configuraciones en application.properties.

El formato para establecer la configuración del nivel de registro es logging.level.[classpath] = [level]. El classpath se especifica ya que los diferentes componentes de la aplicación se pueden configurar con diferentes niveles de registro, lo que es especialmente útil para el aislamiento y la depuración del código.

Para especificar un nivel de registro para todas las clases que no tienen su propia configuración de nivel de registro, el registrador root se puede configurar usando logging.level.root.

En aplicación.propiedades:

1
2
3
logging.level.root=INFO
logging.level.com.test=DEBUG
logging.level.com.service.DemoService=WARN

A partir de esta configuración, todas las clases excepto DemoService y las clases bajo el classpath com.test tendrán sus niveles de registro establecidos en INFO, mientras que las clases test y DemoService tienen sus propios niveles de registro especificados.

Grupos de registros

Los grupos de registro son una forma útil de establecer configuraciones de registrador en un grupo de clases con diferentes rutas de clase. Un ejemplo es si desea establecer todos los niveles de registro de la clase de prueba en DEBUG de una sola vez. Esto es posible usando la configuración logging.group.[groupName]:

1
2
3
4
5
# Initialize log group
logging.group.test=com.test, com.test-prod, com.apptest

# Set log level to log group
logging.level.test=DEBUG

Con este enfoque, no tendrá que configurar individualmente el nivel de registro de todos los componentes relacionados todo el tiempo.

Conclusión

Conocer los diferentes niveles de registro es importante, especialmente en situaciones como la depuración en producción.

Digamos que se ha expuesto un error importante en producción y los registros actuales no tienen suficiente información para diagnosticar la causa raíz del problema. Al cambiar el nivel de registro a DEBUG o TRACE, los registros mostrarán información muy necesaria para identificar detalles cruciales que pueden conducir a la solución.

En Spring, las configuraciones de nivel de registro se pueden establecer en el archivo application.properties que se procesa durante el tiempo de ejecución. Spring admite 5 niveles de registro predeterminados, ERROR, WARN, INFO, DEBUG y TRACE, siendo INFO la configuración de nivel de registro predeterminada.