Log4j: Additivity


Consideremos el siguiente escenario: Hemos configurado un total de 3 appenders en nuestra aplicación; uno para el paquete com.demo.moduleone, otro para el com.demo.moduletwo y el logger raíz com.demo.

La configuración de Log4j debería parecerse a algo como esto (mostrando solo la configuración de los appender y excluyendo el resto de detalle):

Los loggers del Log4j son jerárquicos, por ejemplo, un un logger de Log4j es un antecesor de otro logger si su nombre seguido de un punto es un prefijo del nombre del logger descendiente. Un logger de Log4j se dice que es un padre de un logger hijo si no hay más predecesores entre él y el logger descendiente.

Por tanto, por jerarquía, nuestro rootFileAppender es el appender padr de ambos moduleOneFileAppender y moduleTwoFileAppender. Es decir, todos los mensajes de log provenientes de los appender hijos serán también propagados al appender del padre. Y, en nuestro escenario, los mensajes de log del paquete com.demo.moduleone serán enviados al moduleOneFileAppender más el rootFileAppender. Lo mismo aplica para el com.demo.moduletwo también. Escribirá el mismo log en dos localizaciones diferentes.

¿Cómo evitar esta redundancia?

How to avoid this redundancy?
Para evitar esta redundancia, usamos la aditividad de Log4j (additivity). Simplemente establecemos la propiedad additivity de un logger de Log4j a false y los mensajes destinados a ese logger, no serán propagados a los logger padre. Por tanto, nuestra nuevo fichero de configuración sería:

Con la configuración arriba mostrada, los mensajes de log de com.demo.moduleone irán al moduleOneAppender únicamente y el resto de los mensajes irán al log del rootFileAppender.