web-dev-qa-db-fra.com

log4net: Configurer pour ignorer les messages d'une classe spécifique

Existe-t-il un moyen pour que la configuration log4net ignore une classe spécifique? Par exemple, nous créons généralement un journal dans chaque classe. Similaire à ceci:

private static readonly ILog Log = log4net.LogManager.GetLogger("MyClass");

Le problème est que MyClass enregistre une quantité extrême de données et qu'il devient difficile de trouver des informations sur d'autres classes. C'est un autre développeur qui utilise MyClass donc je ne peux pas simplement entrer et changer les fichiers journaux, mais dans mon environnement, je voudrais les ignorer.

Puis-je définir mon fichier configuration pour ignorer les messages d'une classe spécifique?

63
Kyle

Bien sûr, utilisez un filtre.

Voici l'extrait publié sur le blog, pour référence future - tout crédit à l'auteur de ce blog:

<filter type="log4net.Filter.LoggerMatchFilter">
  <!-- allows this sub-namespace to be logged... -->
  <loggerToMatch value="Noisy.Namespace.But.Important" />
</filter>
<filter type="log4net.Filter.LoggerMatchFilter">
  <!-- ...but not the rest of it -->
  <loggerToMatch value="Noisy.Namespace" />
  <acceptOnMatch value="false" />
</filter>
72
jvenema

Un filtre fonctionne certainement, mais je préférerais désactiver directement l'enregistreur (ou la hiérarchie des enregistreurs) comme ceci:

<logger name="YourNameSpace.WithNoLogging" additivity="false">
    <level value="OFF" />        
</logger>
<logger name="MyClass" additivity="false">
    <level value="OFF" />        
</logger>
<root>
    <level value="ALL" />
    <appender-ref ref="YourAppender" />
</root>

En admettant que YourNameSpace.WithNoLogging est un espace de noms, la configuration affichée désactiverait la journalisation sur tout l'espace de noms. Le deuxième "exemple" désactive la journalisation pour votre classe (selon votre question).

55
Stefan Egli

Je suggère également d'utiliser Filtres . Cependant, étant donné que j'ai eu du mal à trouver l'image complète lorsque j'essayais d'implémenter le filtre, je publie un exemple d'extrait de Configutation file J'ai créé ce qui indique où vont les filtres.

Le filtre pour lequel vous allez dans ce cas serait

log4net.Filter.LoggerMatchFilter ---- (Correspond au début du nom de l'enregistreur.)

Astuce dans le fichier config pour Log4Net c'est important où vous placez vos tags et la priorité de ceux-ci est vraiment importante. Donc dans ce cas <filter> la balise vient après le <appender>opening tag et avant qu'il ne soit <file value = ... /> tag.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
    </configSections>
    <log4net>
        <appender name="RollingFile.PassedDevices" type="log4net.Appender.RollingFileAppender">
            <filter type="log4net.Filter.LoggerMatchFilter">
                <loggerToMatch value="Foo.namespace.bar.mySubclass" />
                <acceptOnMatch value="false" />
            </filter>
            <file value="myPassedDevices.log" />
            <appendToFile value="true" />
            <maximumFileSize value="100KB" />
            <maxSizeRollBackups value="2" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%timestamp    %level  - %message  [%thread]       %logger%newline" />
            </layout>
        </appender>
        <root>
            <level value="DEBUG" />
            <appender-ref ref="RollingFile" /> <!-- My other appender which logs all and I cut it out in this snippet. Remember that you should reference all your appenders in this tag to make them work.-->
            <appender-ref ref="RollingFile.PassedDevices" />
        </root>
    </log4net>
</configuration>

Dans cette technique, vous pouvez avoir plusieurs appenders que vous pouvez rediriger les résultats de journalisation d'un enregistreur spécifique vers un appender distinct au lieu de les ignorer. Comme un appender pour tous les journaux et un pour les journaux filtrés pour un class spécifique.

14
Mehrad

Vous voudrez peut-être essayer d'appliquer une catégorie à vos propres messages Essayez ce fil: Comment ajouter le préfixe de catégorie au message log4net?

2
Orin