¿Es posible marcar nombres comodín en la configuración de log4net?


En mi aplicación, uso log4net, con todos los tipos creando su propio registrador basado en su tipo, por ejemplo:

private static readonly ILog Log = LogManager.GetLogger(typeof(Program));

A medida que estoy desarrollando, dejo el logger raíz en DEPURACIÓN para capturar toda la salida de registro de mi código.

Sin embargo, un componente de terceros también utiliza este mismo enfoque, pero está generando 100s de mensajes de registro por segundo, ninguno de los cuales me interesa.

¿Es posible utilizar algún tipo de comodín en la configuración del registrador, para forzar todos sus registradores para registrar solo en WARN, por ejemplo:

 <logger name="com.thirdparty.*">
    <level value="WARN"/>
  </logger>

[El ejemplo exacto de arriba, usar un * no funciona]

Author: Rob Levine, 2010-01-08

2 answers

Solo puede especificar parte de un espacio de nombres para que se aplique a todos los mensajes dentro de ese espacio de nombres (incluidos los anidados).

Aquí está el ejemplo que uso a menudo:

  <root>
    <level value="FATAL" />
    <appender-ref ref="RollingFile" />
  </root>

  <logger name="MyCompany.Web" >
    <level value="WARN" />
    <appender-ref ref="WebErrors" />
  </logger>

  <!-- Will log all FATALs from NHibernate, including NHibernate.SQL and all the nested -->
  <logger name="NHibernate" >
    <level value="FATAL" />
  </logger>

Además, recomendaría leer el manual. Proporciona mucha explicación. Por ejemplo, puede leer sobre La jerarquía del registrador. Aquí está la cita de allí:

Se dice que un registrador es un antepasado de otro registrador, si su nombre seguido por un punto es un prefijo de la descendiente nombre del registrador. Un leñador se dice que es un padre de un registrador hijo si hay no hay antepasados entre ella y el descendant logger. La jerarquía funciona muy de la misma manera que el espacio de nombres y jerarquía de clases en. NET.

Y también:

Nivel de herencia: El nivel heredado para un logger X dado, es igual al primero nivel no nulo en el registrador jerarquía, comenzando en X y avanzando hacia arriba en la jerarquía hacia el logger raíz.

 34
Author: Dmytrii Nagirniak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-25 12:01:08

No puedes hacer lo contrario de lo que estás pidiendo. Lo que quiero decir es simplemente establecer el nivel de registro predeterminado en warn y luego establecer los registradores específicos que ha definido para DEPURAR.

También, puede establecer el umbral de su appender para DEPURAR y hacer que el otro appender establezca el WARN.

Por ejemplo:

<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
    <applicationName value="Application" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
    <threshold value="WARN" />
</appender>

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender,log4net">
    <to value="[email protected]" />
    <from value="[email protected]" />
    <subject value="Notification" />
    <smtpHost value="server01" />
    <bufferSize value="1" />
    <lossy value="false" />
    <layout type="log4net.Layout.PatternLayout,log4net">
        <conversionPattern value="%property{log4net:HostName} :: %level :: %message %newlineLogger: %logger%newlineThread: %thread%newlineDate: %date%newlineNDC: %property{NDC}%newline%newline" />
    </layout>
    <threshold value="DEBUG" />
</appender>
 4
Author: Brian Hasden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-25 12:00:58