Personalizar el mensaje emitido de un objeto en log4j

Escrito por picodotdev el .
java planeta-codigo programacion
Comentarios

Java

Usar una librería como log4j es probablemente indispensable en una aplicación para obtener información de su funcionamiento, mensajes informativos, advertencias, errores o excepciones que se están produciendo o se han producido. Los mensajes que se emiten contienen información útil para monitorización en tiempo real o su inspección pasado un tiempo.

En cada punto de la aplicación en la que se desea emitir una traza es necesario proporcionar el formato del mensaje y sus parámetros extraídos de las propiedades de los objetos con la intención obtener una traza con los valores de determinadas propiedades. Si es habitual emitir una traza de ciertas clases para evitar poner la misma traza en diferentes puntos de la aplicación log4j posee una funcionalidad para transformar en objeto en un mensaje personalizado como se comenta en su documentación para mensajes.

El método toString() muy posiblemente no es la mejor solución para transformar un objeto a un String de modo que sea emitido por log4j, quizá su valor no sea lo desedeado, se use este método para otro tipo de funcionalidad y no sirve en el caso de querer diferentes mensajes en diferentes lugares de la aplicación.

En log4j implementando una clase de tipo Message se transforman esas instancias en el mensaje de información personalizado. En el caso de la implementación de Message en SimpleProductMessage genera una traza con solo su identificativo y su nombre para la clase Product. En el caso de ProductMessage genera una traza más completa con su identificativo, nombre y color.

El método heredado de getFormattedMessage() es el encargado de generar la traza en este caso utilizando como apoyo los métodos también heredados getFormat() que contiene el patrón del mensaje y getParameters() que devuelve como parámetros para el patrón del mensaje los valores de las propiedades.

En los siguientes casos se utilizan diferentes formas para emitir la traza. En el primer caso se utiliza la forma habitual de proporcionar el patrón y sus parámetros, el segundo caso utiliza el método toString() del objeto. En el tercer y cuarto caso se utilizan las clases que implementan la interfaz Message emitiendo un mensaje diferente cada una de ellas sin tener que proporcionar el patrón ni extraer las propiedades de la clase Producto ya que son estas implementaciones en las que se delega esto.

En todos estos casos las trazas emitidas son las mismas salvo en el caso de ProductMessage que muestra una traza con más información.

En la API de log4j hay multitud de clases Message ya implementadas, por ejemplo, MapMessage para objetos del tipo Map entre otros muchos.

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando ./gradlew run.