Las propiedades del logging no se pueden separar en otro fichero .properties para añadirlo a nuestro contexto ya que el logging se crea antes que el ApplicationContext.
Siguiendo con el formato de la entrada de logging anterior, éste es el fichero logback-spring.xml que puede traducirse a lo que se vio en ella: formato de fecha, de patrón, color y volcado a disco. Puede verse cómo se configura en su documentación.
Además se importan otras configuraciones que se usan dentro de este fichero y se da nombre dinámicamente al archivo de log utilizando algunas propiedades leídas de application.properties.
Hasta ahora hemos estado escribiendo mensajes en consola usando System.out.print*. Sin embargo para conocer el estado de una aplicación no siempre quieren sacarse todos los mensajes por consola. Se puede necesitar aplicar un filtro o realizar otras operaciones como:
Guardar en un fichero log en disco
Enviar un mensaje de correo
Hacer una llamada a un servicio web
Derivar a una cola de mensajes
Activar una sirena
Cualquier cosa mas que se te ocurra
Parece necesario un sistema que permita tomar distintas respuestas cuando se produce un mensaje. La idea de logging es disponer de un registro de mensajes organizados que puedan ser tratados en función de varios factores:
Gravedad del evento (Level)
Momento en que se produce (Date Time)
Componente origen del mensaje (Class del log)
En qué entorno se ejecute la aplicación (desarrollo, pruebas, producción...)
Mensaje que incluya
Otros
De aquí detectamos que sería bueno organizar esos mensajes conteniendo esa información y poder conocer el estado de un sistema en un determinado momento. Existen muchas librerías al respecto:
slf4j proporciona una interface única para varias implementaciones, lo que lo convierte en algo muy conveniente si se quiere cambiar la implementación en un futuro
En esta entrada vamos a ver cómo personalizar el formato del log, trabajar con niveles y todo usando nuestras propiedades. Primero vamos a cambiar nuestra clase Test para que deje de usar System.out.println y use su log:
public class Test {
private final Logger log = LoggerFactory.getLogger(Test.class);
...
public void init() {
log.info("Llamado init(): {}", testString);
}
}
Si ejecutamos vemos que nuestro mensaje aparece igual de formateado que el resto de logs producidos por los otros componentes que usa Spring. Cuando queremos registrar un evento con nuestro logger disponemos de distintos niveles para marcar nuestro mensaje (en el ejemplo de arriba hemos usado el nivel INFO). El orden de prioridad de mayor a menor en slf4j es:
ERROR
WARN
INFO
DEBUG
TRACE
NOTA: Estos niveles dependen de cada librería, no están unificados (ejemplo log4j)
De fecha/hora: el formato de hora es muy fácil de cambiar como en este ejemplo (eliminamos los segundos):
logging.pattern.dateformat=yyyy-MM-dd HH:mm
Del mensaje: se puede modificar el formato completo del mensaje con su propiedad. Puede ser distinto el formato de la consola y el archivo. En este ejemplo se cambia el patrón de logback para formatear la consola utilizando otra propiedad que nos hemos creado para dar el formato de la fecha/hora:
Se pueden volcar los logs a un fichero o directorio especificándose la ruta por propiedades. Busca el archivo con la ruta del siguiente código para verlo (fíjate que el formato es otro al de consola):