name logger ejemplo coloredconsoleappender logging log4net log4

logging - logger - Eliminar el registro duplicado en log4net



log4net levels (2)

Tengo un programa que hace muchas llamadas log4net a los registradores "myprogram". También llama a otro código que realiza llamadas de log4net a otros registradores. Quiero capturar todos los registros superiores a INFO para "mi programa" y todos los registros superiores a WARN para todo lo demás. De esta forma, obtengo los mensajes de trabajo en progreso específicos para la tarea en la que estoy trabajando, pero aún recibo notificaciones de posibles problemas en el código de soporte. Quiero que esto se envíe tanto a la consola como a un archivo de registro.

Tengo la siguiente configuración de log4net:

<log4net> <root> <level value="WARN" /> <appender-ref ref="Console" /> <appender-ref ref="LogFile" /> </root> <logger name="myprogram"> <level value="INFO" /> <appender-ref ref="Console" /> <appender-ref ref="LogFile" /> </logger> <appender name="Console" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message%newline" /> </layout> <threshold value="INFO" /> </appender> <appender name="LogFile" type="log4net.Appender.RollingFileAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="- %utcdate %level %logger %ndc %thread %message%newline" /> </layout> <appendToFile value="false" /> <staticLogFileName value="true" /> <rollingStyle value="Once" /> <file value="mylogfile" /> <immediateFlush value="true" /> <threshold value="INFO" /> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> </appender> </log4net>

Esto tiene mucho sentido para mí: registro> WARN para todo e> INFO para el registrador específico "myprogram".

El problema es que recibo mensajes INFO registrados dos veces tanto en Console como en LogFile. Esto solo ocurre si tengo los elementos <root> y <logger> rellenos; si elimino uno, el otro funciona como espero.

Pude entender si obtenía el doble registro de las entradas de WARN (ya que myprogram coincide tanto con "root" como con "myprogram"), pero está sucediendo en INFO incluso cuando ROOT está (presumiblemente) configurado en WARN.

¿Estoy haciendo algo mal aquí, o es esto un error / ambigüedad de log4net?


Pruebe con este cambio, estableciendo aditividad en falso.

<root> <level value="WARN" /> <appender-ref ref="Console" /> <appender-ref ref="LogFile" /> </root> <logger name="myprogram" additivity="false"> <level value="INFO" /> <appender-ref ref="Console" /> <appender-ref ref="LogFile" /> </logger>


Se está duplicando porque está diciéndole que registre mensajes dos veces. No recomendaría usar aditividad aquí ya que podría experimentar algunos efectos secundarios, simplemente elimine la configuración innecesaria:

<root> <level value="WARN" /> <appender-ref ref="Console" /> <appender-ref ref="LogFile" /> </root> <logger name="myprogram"> <level value="INFO" /> </logger>

No necesita indicar el appender-ref en el logger myprogram ya que los heredará del registrador raíz; si los especifica nuevamente, se registrará dos veces.