2009-09-07 14 views
41

Deseo enviar el nivel de información & anterior al apéndice XML y el nivel de error/fatal al apéndice EventLog.Configurar log4net para enviar errores a diferentes appenders según el nivel

Supongo que tengo que 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 appender correcto para un determinado nivel o rango de niveles?

Esta es la configuración hasta el momento:

<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 en verdad 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> 
+5

Tenga en cuenta que un evaluador sólo es usado por appenders que soportan el almacenamiento en búfer. Si desea especificar un nivel específico por apéndice, solo necesita usar el elemento por sí mismo; no es necesario incluirlo en un evaluador. – Brian

+0

elemento solo se debe utilizar para los appenders que implementan BufferingAppenderSkeleton (es decir, no RollingFileAppender). – dave

+0

Creo que el artículo del señor Graham [aquí] (http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx) te ayudará. –

Respuesta

6

Puede establecer una propiedad de umbral diferente para cada appender. El appender ignora todos los eventos de registro con un nivel inferior al nivel de umbral. Estoy pegando debajo de dos apéndices, uno para los archivos y otro para la base de datos (debe establecer la cadena de conexión). El appender de la base de datos tiene una propiedad de umbral que indica que solo se guardarán errores 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> 
13

Esto se puede hacer usando los threshold o filter elementos dentro de la appender.

Tenga en cuenta que el umbral puede estar directamente debajo del apéndice, donde actúa como un filtro inclusivo, o debajo de un evaluator p.

<evaluator type="log4net.Core.LevelEvaluator"> 
    <threshold value="ERROR"/> 
</evaluator> 

donde actúa como un filtro incluido para saltar de amortiguación (salida inmediata), en su caso.



explicación completa (source):

<threshold value="ERROR" /> 

El umbral se implementa en el AppenderSkeleton y por lo tanto el apoyo de casi todos los appenders. Es simplemente una prueba simple que es que se utiliza para ignorar los eventos de registro que tienen un nivel por debajo del umbral. El umbral se verifica temprano y como una prueba simple es muy rendimiento.

Hay otra manera de especificar el mismo comportamiento que el umbral usando filtros. Los filtros son mucho más flexibles y, como son 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 AppenderSkelton y están soportados por casi todos los appenders. El filtro anterior tiene el mismo efecto que <threshold value="ERROR" />. Es un LevelRangeFilter que permitirá cualquier evento con un nivel en el rango de ERROR a OFF (inclusive). Tenga en cuenta que OFF es el nombre del nivel más alto, por el contrario ALL es el nombre del nivel más bajo.

Los filtros tienen un alto grado de flexibilidad, porque varios filtros pueden ser encadenados juntos para proporcionar un control más fino sobre los acontecimientos que son salida. Debido a esto también tienen un costo más alto en términos de 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 filtrado de umbral , la propiedad Umbral debe usarse en la preferencia a un filtro.

El Evaluator es implementado por el BufferingAppenderSkeleton y está por lo tanto sólo está soportado por appenders que se extienden esta clase base y proporcionan soporte para almacenamiento en búfer. El SmtpAppender es uno de esos apiladores .

El Evaluator es un objeto conectable que es utilizado por el BufferingAppenderSkeleton para determinar si un evento de registro no debe ser amortiguada , pero en vez escrito/enviado inmediatamente. Si el Evaluador decide que el evento es importante, se enviará todo el contenido del buffer actual junto con el evento. El evaluador no funciona como el umbral o un filtro en que no descarta eventos .

1

Tenía la misma pregunta. Parece, suponiendo que entiendo la pregunta original, que los umbrales no funcionarán, ya que enviarán cierta salida a un appender y que más el resto al otro appender. Pude hacerlo funcionar usando LevelRangeFilter como se sugirió anteriormente. Quería ERROR, INFO y WARN para ir a un appender y todos los demás para ir a otro appender, pero no 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

Cuestiones relacionadas