coloredconsoleappender - log4net implementation in c#
¿Es posible usar nombres de registrador comodín en la configuración de log4net? (2)
¿No puedes hacer lo contrario de lo que estás pidiendo? Lo que quiero decir es que simplemente establezca el nivel de registro predeterminado para advertir y luego configure los registradores específicos que ha definido en DEBUG.
Además, puede establecer el umbral de su appender en DEBUG y hacer que el otro appender configure 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>
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));
Mientras estoy desarrollando, dejo el registrador raíz en DEBUG para capturar toda la salida del registro de mi código.
Sin embargo, un componente de un tercero también utiliza este mismo enfoque, pero está generando cientos de mensajes de registro por segundo, ninguno de los cuales me interesa.
¿Es posible usar algún tipo de comodín en la configuración del registrador, para forzar a todos sus registradores a que solo registren en WARN, por ejemplo:
<logger name="com.thirdparty.*">
<level value="WARN"/>
</logger>
[El ejemplo exacto arriba, usando un * no funciona]
Solo puede especificar parte de un espacio de nombres para que se aplique a todos los mensajes dentro de ese espacio de nombres (incluido el anidado).
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, puedes leer acerca de 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 de un punto es un prefijo del nombre del registrador descendiente. Se dice que un registrador es el padre de un registrador secundario si no hay ancestros entre él y el registrador descendiente. La jerarquía funciona de la misma manera que el espacio de nombres y la jerarquía de clases en .NET.
y también:
Herencia de nivel: el nivel heredado para un registrador X dado es igual al primer nivel no nulo en la jerarquía del registrador, comenzando en X y avanzando hacia arriba en la jerarquía hacia el registrador raíz.