configuration - example - log4net logger name
Configure log4net para enviar errores a diferentes usuarios segĂșn el nivel (3)
Quiero enviar el Nivel de información y superior al aplicador XML y el Nivel de error / fatal al agregador EventLog.
Supongo que necesito modificar el elemento raíz de la configuración pero estoy luchando con la sintaxis. ¿Cuál es la sintaxis de configuración para dirigir los registros al aplicador correcto para un nivel o rango de niveles dado?
Esta es la configuración hasta ahora:
<log4net>
<appender name="SomeXmlAppender" type="log4net.Appender.RollingFileAppender">
...
</appender>
<appender name="SomeEventLogAppender" type="log4net.Appender.EventLogAppender">
...
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="SomeXmlAppender" />
<appender-ref ref="SomeEventLogAppender" />
</root>
</log4net>
Edit: Gracias @agileguy. Esa publicación sí contenía la sintaxis que necesitaba. La solución de trabajo ahora se ve así:
<log4net>
<appender name="SomeXmlAppender" type="log4net.Appender.RollingFileAppender">
...
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="INFO"/>
</evaluator>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="INFO" />
<acceptOnMatch value="true" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
</appender>
<appender name="SomeEventLogAppender" type="log4net.Appender.EventLogAppender">
...
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="ERROR"/>
</evaluator>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR" />
<acceptOnMatch value="true" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="SomeXmlAppender" />
<appender-ref ref="SomeEventLogAppender" />
</root>
</log4net>
Esto se puede hacer usando el threshold
o elementos de filter
dentro del appender.
Tenga en cuenta que el umbral puede estar directamente debajo del appender, donde actúa como un filtro inclusivo, o debajo de un evaluator
por ejemplo
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="ERROR"/>
</evaluator>
donde actúa como un filtro inclusivo para omitir el almacenamiento en búfer (salida inmediata), cuando corresponda.
Explicación completa ( source ):
<threshold value="ERROR" />
El umbral se implementa en el
AppenderSkeleton
y, por lo tanto, es compatible con casi todos los agregadores. Es solo una prueba simple que se usa para ignorar los eventos de registro que tienen un nivel por debajo del umbral. El umbral se comprueba temprano y como una prueba simple es muy eficaz.Hay otra manera de especificar el mismo comportamiento que el umbral usando filtros. Los filtros son mucho más flexibles y, al ser conectables, también puede desarrollar su propia lógica personalizada e insertarla en la cadena de filtros.
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR" />
<levelMax value="OFF" />
</filter>
Al igual que los filtros de verificación de umbral, se implementan en la clase base de AppenderSkelton y son compatibles con casi todos los agregadores. El filtro anterior tiene el mismo efecto que <threshold value="ERROR" />
. Es un LevelRangeFilter que permitirá a través de cualquier evento con un nivel en el rango ERROR
a OFF
(inclusivo). Tenga en cuenta que OFF
es el nombre del nivel más alto, a la inversa, ALL
es el nombre del nivel más bajo.
Los filtros tienen una gran flexibilidad porque se pueden encadenar múltiples filtros para proporcionar un control preciso sobre los eventos que se emiten. Debido a esto, también tienen un costo más alto en términos de rendimiento, cada filtro en la cadena es un objeto y se le pide que decida el curso de acción correcto. En el caso simple del filtro de umbral, la propiedad Umbral debe usarse con preferencia a un filtro.
El
Evaluator
se implementa medianteBufferingAppenderSkeleton
y, por lo tanto, solo lo admiten los agregadores que extienden esta clase base y proporcionan soporte para el almacenamiento en búfer. El SmtpAppender es uno de esos agregadores.El
Evaluator
es un objeto conectable que utiliza BufferingAppenderSkeleton para determinar si un evento de registro no debe almacenarse en búfer, sino que debe escribirse o enviarse de inmediato. Si el evaluador decide que el evento es importante, todo el contenido del búfer actual se enviará junto con el evento. El evaluador no funciona como el umbral o un filtro porque no descarta los eventos.
Puede establecer una propiedad de umbral diferente para cada appender. Todos los eventos de registro con un nivel inferior al nivel de umbral son ignorados por el appender. Estoy pegando debajo de dos agregadores, uno para archivos y otro para base de datos (debe establecer su cadena de conexión). El agregador de la base de datos tiene una propiedad de umbral que indica que solo los errores se guardarán en la base de datos.
<configuration>
<log4net>
<!--Database appender-->
<appender name="DbAppender" type="log4net.Appender.ADONetAppender">
<bufferSize value="0" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="Data Source=AEG-PC/SQLEXPRESS;Initial Catalog=JCZ6;Uid=sa;Pwd=qwerty;" />
<commandText value="INSERT INTO Log4Net ([date],[thread],[level],[logger],[message],[exception]) VALUES
(@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%t" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="10" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%p" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%c" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%m" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
<threshold value="Error" /> <!--THIS IS THE IMPORTANT LINE-->
</appender>
<!--File appender-->
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="log-file.txt" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="FileAppender" />
<appender-ref ref="DbAppender" />
</root>
</log4net>
</configuration>
Tenía la misma pregunta. Parece, asumiendo que estoy entendiendo la pregunta original, que los umbrales no funcionarán, ya que enviarán cierta salida a un appender y eso más el resto a la otra appender. Pude hacerlo funcionar usando el LevelRangeFilter como se sugirió anteriormente. Quería que ERROR, INFO y WARN fueran a un appender y que todos los demás fueran a otro appender, pero no a ERROR, INFO y WARN.
Aquí está la configuración que funcionó para mí:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="LoggingAppender" type="log4net.Appender.FileAppender" >
<file value="logs.txt" />
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="INFO"/>
<levelMax value="OFF"/>
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
</layout>
</appender>
<appender name="TracingAppender" type="log4net.Appender.FileAppender" >
<file value="traces.txt" />
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ALL"/>
<levelMax value="DEBUG"/>
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
</layout>
</appender>
<root>
<appender-ref ref="LoggingAppender"/>
<appender-ref ref="TracingAppender"/>
</root>
</log4net>
</configuration>
Gracias nick