org logmanager logger example ejemplo descargar logging log4j

logging - logmanager - log4j registrando dos veces



org apache logging log4j jar download (6)

Estoy usando log4j para registrar el error y otra información del sistema. pero viene de la información registrada dos veces en el nivel INFO.

public static void main(final String... args) throws Exception { LOGGER.info("program started"); try { // try body codes } catch (Exception ex) { LOGGER.info("program start-up failed.",ex); } }

sin embargo, cuando el programa inicia o falla la información registrada dos veces, cualquiera puede ayudarme a encontrar cuál podría ser la razón.



Para aquellos que usan formato XML:

<logger name="package.class" additivity="false"> <level value="info" /> <appender-ref ref="file" /> <appender-ref ref="console" /> </logger>

Nota: de forma predeterminada, los registradores tienen su indicador de aditividad establecido en verdadero.


Parece que sus mensajes están siendo registrados una vez por el registrador de raíz y nuevamente por el registrador específico ya que es posible que tenga configurados los apéndices (puede estar en diferentes lugares, en un archivo de propiedades y luego en código).

Esto puede resolverse estableciendo aditividad a falso en su registrador. El manual Log4j menciona aditividad en la sección de Anexos y Diseño. Verifique eso


Si puede ejecutar el programa con un depurador de Java, coloque un punto de interrupción en el programa donde ocurre una de estas llamadas de doble registro.

Examine el objeto logger en el depurador. Si es un org.apache.log4j.Logger (v 1.2.x), entonces puede tener un AppenderAttachableImpl. Puede consultar el AppenderAttachableImpl para la lista de appenders.

Si encuentras más de 1 appender, este podría ser el problema, y ​​una pista para solucionarlo.


Simplemente agrega

logger.setadditivity(false);

a su código ( Reference ).

Estamos teniendo resultados dobles en la consola, es porque los anexos no son únicos, son aditivos. Es decir, una categoría hereda todos los apéndices de sus antepasados ​​(por defecto). Si agregamos un appender a una categoría y escribe en la misma secuencia subyacente (consola, mismo archivo, etc.) que otro appender, el mismo mensaje de registro aparecerá dos veces (o más) en el registro. Además, si dos categorías en una jerarquía están configuradas para usar el mismo nombre de apéndice, Log4j escribirá dos veces en ese appender. Configurado para esa categoría


Una alternativa potencial para ajustar la propiedad de additivity es examinar sus registradores de lo más específico a lo más genérico. En el siguiente ejemplo, esperaríamos ver el inicio de sesión doble en la consola para cualquier evento de registro que ocurra en foo.bar.LoggingExampleClass. Sería seguro eliminar el apilador de consola adicional del foo.bar.LoggingExampleClass Logger, ya que está cubierto por Root Logger.

<Logger name="foo.bar.LoggingExampleClass" level="DEBUG"> <AppenderRef ref="Console" /> <!-- THIS APPENDER COULD BE REMOVED --> <AppenderRef ref="FooBarPackageLogging" /> </Logger> <Root level="WARN"> <AppenderRef ref="Console" /> <AppenderRef ref="MainLogFile" /> </Root>

Existen compensaciones tanto para el enfoque de ajuste de aditividad como para el enfoque de ajuste del appender. Desactivar la adición podría inadvertidamente detener el uso de un appender de registrador de nivel genérico deseable. En el ejemplo anterior, establecer la propiedad additivity additivity="false" en foo.bar.LoggingExampleClass Logger significa que el evento de registro no se agregará al MainLogFile al que se hace referencia en el Root Logger.

Por otro lado, depender de los appenders principales puede ser problemático si los appenders principales se modifican sin examinar los efectos en los registradores más granulares. Por ejemplo, supongamos que hay un requisito de que los eventos de registro foo.bar.LoggingExampleClass se escriban en la consola. Actualmente se encuentran en la configuración de ejemplo anterior debido a la adición, incluso si se elimina el apilador de la consola del foo.bar.LoggingExampleClass Logger. Sin embargo, si el apilador de consola también se eliminó del registrador de raíz sin ningún ajuste adicional, el requisito ya no se cumpliría.