Configurer log4net pour envoyer des erreurs à différents fournisseurs de services en fonction du niveau

je veux envoyer le niveau D'information & ci-dessus à L'appender XML et le niveau D'erreur/Fatal à l'appender EventLog.

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 logs vers l'appender correct pour un niveau donné ou une plage 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 post contenait en effet le syntaxte dont j'avais besoin. Le 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>
41
demandé sur Philipp M 2009-09-07 14:12:06

3 réponses

Cela peut être fait en utilisant le threshold ou filter éléments à l'intérieur de l'appender.

notez que le seuil peut être directement sous l'appender, où il agit comme un filtre inclusif, ou sous un evaluator e.g.

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

où il agit comme un filtre inclusif pour sauter le tampon (sortie immédiate), le cas échéant.




explication Complète ( source):

<threshold value="ERROR" />

le seuil est implémenté dans le AppenderSkeleton et donc soutenu par presque tous les appenders. C'est juste un test simple qui est 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 y a une autre façon de spécifier le même comportement que le seuil à l'aide de filtres. Les filtres sont beaucoup plus flexibles et comme ils sont enfichable, vous pouvez également développer votre propre logique et de l'insérer dans la chaîne du filtre.

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

comme les filtres de vérification de seuil sont implémentés dans la classe de base AppenderSkelton et sont supportés 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 gamme ERROROFF (inclus). Notez que OFF est le nom du plus haut niveau, inversement ALL est le nom du niveau le plus bas.

les filtres ont beaucoup de flexibilité parce que les filtres multiples peuvent être enchaînés ensemble pour fournir un contrôle à grains fins 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 filtrage des seuils la propriété Threshold doit être utilisée dans de préférence à un filtre.

Evaluator est implémenté par le BufferingAppenderSkeleton et est donc seulement soutenu par des appenders qui étendent cette classe de base et fournir un soutien pour le tampon. Le SmtpAppender est un tel appender.

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 tout le contenu de la tampon courant sera envoyé à l'événement. L'évaluateur n' ne fonctionne pas comme le seuil ou un filtre en ce qu'il ne les événements de rejet.

13
répondu Danny Varod 2014-06-02 17:17:03

Vous pouvez définir une propriété de seuil différente pour chaque appender. Tous les événements log avec un niveau inférieur au niveau seuil sont ignorés par l'utilisateur. Je suis collé ci-dessous deux appenders, un pour les fichiers et un autre pour la base de données (vous devriez définir votre chaîne de connexion). La base de données appender a une propriété de seuil indiquant que seules les erreurs seront sauvegardé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>
6
répondu Francisco Goldenstein 2014-09-15 13:20:13

j'avais la même question. Il semble, en supposant que je comprenne la question originale, que les seuils ne fonctionneront pas car ils enverront une certaine sortie à un appender et que plus le reste à l'autre appender. J'ai été capable de le faire fonctionner en utilisant le Leverrangefilter comme suggéré ci-dessus. Je voulais que ERROR, INFO and WARN aille à un appender et que tous les autres aillent à un autre appender, mais pas ERROR, INFO and WARN.

Voici 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

2
répondu nickdu 2015-07-06 02:36:04