visual studio ejemplo log4net log4net-configuration

studio - Cómo registrar diferentes niveles de registro en diferentes log appender en log4net



log4net levels (2)

Tengo un WinForm que muestra información de registro pero quiero que se muestre solo a nivel INFO pero quiero que el registro en el archivo de registro contenga también el nivel DEBUG.

A continuación se muestra mi configuración:

<?xml version="1.0" encoding="utf-8" ?> <!-- This section contains the log4net configuration settings --> <log4net> <!-- Define some output appenders --> <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="${ALLUSERSPROFILE}//Application Data//logs//Gateway" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <param name="StaticLogFileName" value="false" /> <datePattern value=".yyyyMMdd.lo/g" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date | [%thread] | %-5level | %logger | %message %newline" /> </layout> </appender> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> <mapping> <level value="DEBUG" /> <backColor value="Blue" /> </mapping> <mapping> <level value="INFO" /> <backColor value="Green" /> </mapping> <mapping> <level value="WARN" /> <backColor value="Yellow" /> </mapping> <mapping> <level value="ERROR" /> <backColor value="Red" /> </mapping> <mapping> <level value="FATAL" /> <backColor value="Red, HighIntensity" /> </mapping> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> </layout> </appender> <appender name="RichTextBoxAppender" type="Gateway.RichTextBoxAppender,Gateway" > <layout type="log4net.Layout.PatternLayout"> <param name="Header" value="[Header]/r/n"/> <param name="Footer" value="[Footer]/r/n"/> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" /> </layout> <mapping> <level value="DEBUG" /> <textColorName value="DarkGreen" /> </mapping> <mapping> <level value="INFO" /> <textColorName value="ControlText" /> </mapping> <mapping> <level value="WARN" /> <textColorName value="Blue" /> </mapping> <mapping> <level value="ERROR" /> <textColorName value="Red" /> <bold value="true" /> <pointSize value="10" /> </mapping> <mapping> <level value="FATAL" /> <textColorName value="Black" /> <backColorName value="Red" /> <bold value="true" /> <pointSize value="12" /> <fontFamilyName value="Lucida Console" /> </mapping> </appender> <!-- Setup the root category, add the appenders and set the default level --> <root> <level value="WARN" /> <appender-ref ref="LogFileAppender" /> <appender-ref ref="ColoredConsoleAppender" /> <appender-ref ref="RichTextBoxAppender" /> </root> <logger name ="Gateway" additivity="false"> <level value="INFO" /> <appender-ref ref="LogFileAppender" /> <appender-ref ref="ColoredConsoleAppender" /> <appender-ref ref="RichTextBoxAppender" /> </logger> </log4net>

En este momento está configurado en INFO para LogFileAppender y RichTextBoxAppender. Intenté sacar el LogFileAppender en el registrador de Gateway, moverlo a otro registrador y establecerlo en el nivel "DEBUG" para este nuevo registrador, pero todavía está haciendo uno o el otro. ¿Cómo lo configuro para que LogFileAppender tenga nivel DEBUG y RichTextBoxAppender tenga nivel INFO?


Debería poder agregar un filtro a ambos de sus agregadores.

<filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="INFO" /> <levelMax value="FATAL" /> </filter>

De esta manera, un usuario solo iniciará sesión en un determinado nivel, mientras que el otro en un nivel diferente, aunque estén definidos por el mismo registrador.


Estoy de acuerdo con @gwhitake en que puedes usar el filtro de rango de nivel. Sin embargo, también quiero agregar que puede usar el filtro LevelMatch si solo desea seleccionar un nivel. Este filtro también le permite agregar otro filtro al final para que pueda crear un filtro que tenga dos o más niveles, incluso si no están uno al lado del otro en el orden.

Por ejemplo, el siguiente filtro capturará solo los mensajes DEBUG y ERROR (solo como un ejemplo):

<filter type="log4net.Filter.LevelMatchFilter"> <levelToMatch value="DEBUG"/> </filter> <filter type="log4net.Filter.LevelMatchFilter"> <levelToMatch value="ERROR"/> </filter> <filter type="log4net.Filter.DenyAllFilter" />

La clave aquí es que necesitamos tener DenyAllFilter al final. Esto le dice al registrador que si llega a esta línea, no lo registre. De esa manera, se registrarán los mensajes DEBUG, los mensajes de ERROR y nada más.

Hay muchas formas de manipular el filtro para obtener exactamente lo que desea. Aquí hay un artículo (descargo de responsabilidad completo: lo escribí) que muestra cómo hacer una serie de cosas diferentes con el filtro además del rango de nivel:

http://www.codeproject.com/KB/dotnet/Log4net_Tutorial.aspx