web-dev-qa-db-fra.com

Configurez Log4Net pour envoyer des erreurs à différents annexes en fonction du niveau

Je souhaite envoyer des informations niveau et ci-dessus à l'appendeur XML et à l'erreur/niveau mortel au Appendend eventLog.

Je suppose que je dois modifier l'élément racine de la configuration, mais je me débats avec la syntaxe. Quelle est la syntaxe de configuration pour diriger les journaux dans le bonppender pour un niveau ou une plage de niveaux donné?

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 post contenait effectivement la syntaxe 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>
43
grenade

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

Notez que le seuil peut être directement sous l'appendeur, où il sert de filtre inclusif ou sous un evaluator par ex.

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

où il agit comme un filtre inclusif pour sauter la mémoire 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 presque tous les appendeurs. Il s'agit simplement d'un simple test utilisé pour ignorer les événements de journalisation ayant un niveau inférieur au seuil. Le seuil est vérifié tôt et comme un test simple est très performant.

Il existe un autre moyen de spécifier le même comportement que le seuil à l'aide de filtres. Les filtres sont beaucoup plus flexibles et, car ils sont pluggables, 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 de seuil sont implémentés dans la classe de base des appendeurskelton et sont soutenus par presque tous les appendeurs. Le filtre ci-dessus a le même effet que <threshold value="ERROR" />. C'est un niveau de niveau de niveau qui permettra tous les événements avec un niveau de 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 fin à la grain des événements de production. De ce fait, ils ont également un coût plus élevé en termes de performance, chaque filtre de la chaîne est un objet et est invité à décider du bon plan d'action. Dans le cas simple du filtrage du seuil, la propriété de seuil doit être utilisée de préférence à un filtre.

Le Evaluator est mis en œuvre par le BufferingAppenderSkeleton et est donc uniquement pris en charge par les annexes qui étendent cette classe de base et fournissent un soutien au tampon. Le SmtpAppender est un tel appendeur.

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

14
Danny Varod

Vous pouvez définir une propriété de seuil différente pour chaque appendend. Tous les événements de journal avec niveau inférieur au niveau de seuil sont ignorés par l'appendeur. Je colle sous deux appendeurs, un pour les fichiers et un autre pour la base de données (vous devez définir votre chaîne de connexion). L'appendeur de base de données dispose d'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>
6

J'ai eu la même question. Il apparaît, en supposant que je comprenais la question initiale, que les seuils ne fonctionneront pas car il enverra une certaine production à un appendeur et que plus le reste de l'autre appendeur. J'ai été capable de le faire fonctionner avec le niveau SwikRangefilter comme suggéré ci-dessus. Je voulais une erreur, des informations et avertit d'aller à un appendeur et à tous les autres pour aller à un autre appendeur, mais pas d'erreur, d'informations et d'avertir.

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
nickdu