2009-09-07 7 views
41

Je souhaite envoyer le niveau d'information & ci-dessus à l'appender XML et le niveau Erreur/Fatal à l'appender EventLog. Je comprends que j'ai besoin de modifier l'élément racine de la config mais je suis aux prises avec la syntaxe. Quelle est la syntaxe de configuration pour diriger les journaux vers l'appender correct pour un niveau ou une gamme de niveaux donnés?Configurer log4net pour envoyer des erreurs à différents appenders en fonction du niveau

Ceci est la configuration jusqu'à présent:

<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: Merci @agileguy. Ce poste contenait en effet le syntxt dont j'avais besoin. La solution de travail ressemble maintenant à ceci:

<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

Notez qu'un évaluateur est utilisé uniquement par appenders qui prennent en charge en mémoire tampon. Si vous souhaitez spécifier un niveau spécifique par appender, il vous suffit d'utiliser l'élément en lui-même - il n'est pas nécessaire de l'encapsuler dans un évaluateur. L'élément – Brian

+0

ne doit être utilisé que pour les appenders implémentant BufferingAppenderSkeleton (c'est-à-dire pas RollingFileAppender). – dave

+0

Je pense que l'article de M. Graham [ici] (http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx) vous aidera à démarrer. –

Répondre

6

Vous pouvez définir une propriété de seuil différente pour chaque appender. Tous les événements de journal avec un niveau inférieur au niveau de seuil sont ignorés par l'appender. Je colle en dessous de deux appenders, un pour les fichiers et un autre pour la base de données (vous devez définir votre chaîne de connexion). L'appender de base de données a une propriété de seuil indiquant que seules les erreurs vont être enregistrées dans la base de données.

<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

Cela peut être fait en utilisant les threshold ou filter éléments du appender.

Notez que le seuil peut être directement sous l'appender, où il agit comme un filtre inclusif, ou sous un evaluator par exemple. Où il agit comme un filtre inclusif pour l'omission de la mise en tampon (sortie immédiate), le cas échéant.



explication complète (source):

<threshold value="ERROR" /> 

Le seuil est mis en œuvre dans le AppenderSkeleton et donc soutenu par la quasi-totalité appenders. C'est juste un test simple utilisé pour ignorer les événements de journalisation qui ont un niveau inférieur au seuil. Le seuil est vérifié tôt et comme un test simple est très performant .

Il existe une autre façon de spécifier le même comportement que le seuil en utilisant des filtres. Les filtres sont beaucoup plus flexibles et comme ils sont enfichables, vous pouvez également développer votre propre logique personnalisée et l'insérer dans la chaîne de filtre.

<filter type="log4net.Filter.LevelRangeFilter"> 
    <levelMin value="ERROR" /> 
    <levelMax value="OFF" /> 
</filter> 

Comme les filtres de contrôle des seuils sont mises en œuvre dans la classe de base AppenderSkelton et sont pris en charge par presque tous les appenders. Le filtre ci-dessus a le même effet que <threshold value="ERROR" />. C'est un LevelRangeFilter qui permettra à travers tous les événements avec un niveau dans la plage ERROR à OFF (inclus). Notez que OFF est le nom du plus haut niveau, inversement ALL est le nom du niveau le plus bas.

Les filtres ont une grande flexibilité, car plusieurs filtres peuvent être chaînés ensemble pour fournir un contrôle plus fin sur les événements qui sont sortie. Pour cette raison, ils ont également un coût plus élevé en termes de performance, chaque filtre de la chaîne est un objet et il est demandé à de décider de la bonne marche à suivre. Dans le cas simple du filtrage de seuil , la propriété Threshold devrait être utilisée dans la préférence pour un filtre.

Le Evaluator est mis en oeuvre est donc que par le BufferingAppenderSkeleton et soutenu par appenders qui étendent cette classe de base et offrent un soutien en mémoire tampon. Le SmtpAppender est un tel appender.

Le Evaluator est un objet qui est utilisé connectable par le BufferingAppenderSkeleton pour déterminer si un événement de journalisation ne doit pas tamponner, mais écrit/envoyé immédiatement. Si l'évaluateur décide que l'événement est important, tout le contenu du tampon courant sera envoyé avec l'événement. L'évaluateur ne fonctionne pas comme le seuil ou un filtre en ce sens qu'il ne supprime pas les événements .

1

J'ai eu la même question. Il semble, en supposant que je comprenne la question initiale, que les seuils ne fonctionneront pas car cela enverra une certaine sortie à un appender et cela plus le reste à l'autre appender. J'ai été capable de le faire fonctionner en utilisant le LevelRangeFilter comme suggéré ci-dessus. Je voulais ERREUR, INFO et WARN aller à un appender et tous les autres pour aller à un autre appender, mais pas ERREUR, INFO et WARN.

est ici la configuration qui a fonctionné pour moi:

<?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> 

Merci, Nick

Questions connexes