43 votes

Configurez log4net pour envoyer des erreurs à différents appenders en fonction du niveau

Je veux envoyer des Infos au Niveau et au-dessus de l'XML appender et/Erreur Fatale Niveau pour le Journal des événements appender.

Je suppose que j'ai besoin de modifier l'élément racine de la config, mais j'ai du mal avec la syntaxe. Quelle est la syntaxe de configuration pour diriger les journaux à la bonne appender pour un niveau donné ou à une gamme de niveaux?

C'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 n'a en effet contenir les syntaxt 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>

19voto

Daniel Elliott Points 13253

Je pense que l'article de M. Graham ici va vous faire avancer.

La gentillesse,

Dan

14voto

Danny Varod Points 8685

Cela peut être fait à l'aide de l' threshold ou filter des éléments au sein de l'appender.

Notez que le seuil peut être directement sous l'appender, où il agit comme intégrateur de filtre, ou en vertu d'un evaluator par exemple

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

où il agit comme intégrateur de filtre pour sauter de mise en mémoire tampon (résultat immédiat), le cas échéant.



Explication complète (source):

<threshold value="ERROR" />

Le Seuil est mis en œuvre dans l' AppenderSkeleton et, par conséquent, soutenu par presque tous les appenders. C'est juste un simple test qui est utilisé pour ignorer la journalisation des événements qui ont un niveau en dessous du seuil. Le seuil est vérifié au début et comme un test simple est très performant.

Il est une autre façon de spécifier le même comportement que le seuil à l'aide de filtres. Les filtres sont beaucoup plus souples et qu'ils sont enfichable, vous pouvez également développer votre propre logique et de l'insérer dans la chaîne de filtres.

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

Comme le Seuil de vérifier que les Filtres sont mis en œuvre dans le AppenderSkelton de la classe de base et sont pris en charge par presque tous les appenders. Le dessus du filtre a le même effet qu' <threshold value="ERROR" />. C'est un LevelRangeFilter qui permettra à travers des événements avec un niveau de gamme ERROR de OFF (inclus). Notez que OFF est le nom du plus haut niveau, à l'inverse ALL est le nom du niveau le plus bas.

Les filtres ont une grande flexibilité, car plusieurs filtres peuvent être liés ensemble pour fournir une granularité fine de contrôle sur les événements qui sont de sortie. En raison de cela, ils ont aussi un coût plus élevé en termes de la performance, chaque filtre de la chaîne est un objet et il est demandé de décider sur le bon déroulement de l'action. Dans le cas simple de la le filtrage des seuils le Seuil de propriété doit être utilisée de préférence à un filtre.

L' Evaluator est mis en œuvre par l' BufferingAppenderSkeletonet est donc pris en charge uniquement par les appenders qui s'étendent de cette classe de base et de fournir un soutien pour la mise en mémoire tampon. Le SmtpAppender est l'un de ces appender.

L' Evaluator est une enfichable de l'objet qui est utilisé par le BufferingAppenderSkeleton pour déterminer si un événement de journalisation ne devrait pas être mis en mémoire tampon, mais plutôt écrit/envoyé immédiatement. Si l'Évaluateur décide que l'événement est important, alors la totalité du contenu de la tampon courant sera envoyé à l'événement. L'évaluateur n' ne pas fonctionner comme le seuil ou un filtre en ce qu'il n'a pas les événements de rejet.

6voto

Vous pouvez définir une propriété de seuil différente pour chaque appender. Tous les événements de journal dont le niveau est inférieur au seuil sont ignorés par l'appender. Je colle ci-dessous deux ajouts, un pour les fichiers et un autre pour la base de données (vous devez définir votre chaîne de connexion). La base de données appender 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>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X