2009-03-16 19 views
58

Tengo un programa que realiza 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.Eliminar el registro duplicado en log4net

que tienen 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 y> Información para el registrador "miprograma" específica.

El problema es que estoy recibiendo mensajes INFO registrados dos veces tanto en la consola como en el archivo de registro. Esto solo ocurre si tengo los elementos <root> y <logger> rellenos; si elimino uno, el otro funciona como espero.

Pude entender si obtenía entradas dobles de entradas 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?

Respuesta

72

Usted está consiguiendo duplican porque le está diciendo que para registrar los mensajes dos veces. Yo no recomendaría el uso de aditividad aquí, ya que puede experimentar algunos efectos secundarios, basta con quitar 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 es necesario indicar el appender-ref en el miprograma registrador ya que heredará del registrador de raíz; si los especifica nuevamente, se registrará dos veces.

+0

Esto funcionó bien para mí cuando me encontré con el mismo problema. Esto también evita el problema de la adición –

+1

Esta es la respuesta correcta. Los madereros heredan los appenders de la raíz. ¡Gracias! –

+1

@Jeffrey ¿sabe usted cuáles son los problemas con el uso de la aditividad? No he tenido éxito en encontrar nada documentado que Google sepa. – Tinister

67

Pruebe con este cambio, estableciendo la 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> 
+1

Eso lo hizo; gracias un paquete. –

+2

Esta es una buena forma de asegurarse de que todos los mensajes registrados en el registro 'myprogram' no lleguen al registrador de raíz. – Llyle

+0

Gracias, esto solucionó el problema que estaba buscando en Google. – Kugel

Cuestiones relacionadas