2010-01-07 3 views
23

Dans mon application, j'utilise log4net, tous les types créant leur propre enregistreur en fonction de leur type - par ex. Comme je suis en train de développer, je laisse l'enregistreur de racine sur DEBUG de manière à capturer toutes les sorties de mon code.Est-il possible de nommer les enregistreurs génériques dans la configuration de log4net?

Cependant, un composant tiers utilise également cette même approche, mais est la génération 100s de messages du journal d'une seconde, aucun dont je suis intéressé par.

Est-il possible d'utiliser une sorte de caractères génériques dans l'enregistreur configuration, pour forcer tous leurs enregistreurs à se connecter uniquement à WARN, par exemple :

<logger name="com.thirdparty.*"> 
    <level value="WARN"/> 
    </logger> 

[L'exemple exacte ci-dessus, en utilisant un * ne fonctionne pas]

Répondre

34

Vous pouvez simplement indiquer une partie d'un espace de noms afin qu'il appliquera à tous les messages dans ce namespace (y compris imbriqué).

Voici l'exemple que j'utilise souvent:

<root> 
    <level value="FATAL" /> 
    <appender-ref ref="RollingFile" /> 
    </root> 

    <logger name="MyCompany.Web" > 
    <level value="WARN" /> 
    <appender-ref ref="WebErrors" /> 
    </logger> 

    <!-- Will log all FATALs from NHibernate, including NHibernate.SQL and all the nested --> 
    <logger name="NHibernate" > 
    <level value="FATAL" /> 
    </logger> 

De plus, je recommande de lire le manuel. Cela fournit beaucoup d'explications. Par exemple, vous pouvez lire sur Logger Hierarchy. Voici la citation de là:

Un enregistreur est considéré comme un ancêtre de un autre enregistreur si son nom suivi de un point est un préfixe du nom de l'enregistreur descendant . Un enregistreur est considéré comme un parent d'un enregistreur enfant s'il existe aucun ancêtre entre lui et le consignateur . La hiérarchie fonctionne à peu près de la même manière que l'espace de noms et la hiérarchie des classes dans .NET.

et aussi:

Level Héritage: Le niveau hérité d'un enregistreur X donné, est égal au premier niveau non nul dans l'enregistreur hiérarchie, à partir de X et en haut dans la hiérarchie vers l'enregistreur racine.

+0

@Dmitriy - Vous avez raison. Je n'ai jamais su cela! Je me sens presque idiot de demander maintenant :). Merci d'avoir répondu. –

+0

Wow, moi non plus. C'est une bonne information. –

+0

BTW, tout ce qui est bien documenté sur le site Web de log4net. J'ai ajouté le lien à la réponse. –

4

Tu ne peux pas faire le contraire de ce que vous demandez. Ce que je veux dire est juste de définir le niveau de journal par défaut à warn, puis définissez les loggers spécifiques que vous avez définis à DEBUG.

En outre, vous pouvez définir le seuil de votre appender sur DEBUG et demander à l'autre utilisateur de définir le WARN.

Par exemple:

<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
    <applicationName value="Application" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
    </layout> 
    <threshold value="WARN" /> 
</appender> 

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender,log4net"> 
    <to value="[email protected]" /> 
    <from value="[email protected]" /> 
    <subject value="Notification" /> 
    <smtpHost value="server01" /> 
    <bufferSize value="1" /> 
    <lossy value="false" /> 
    <layout type="log4net.Layout.PatternLayout,log4net"> 
     <conversionPattern value="%property{log4net:HostName} :: %level :: %message %newlineLogger: %logger%newlineThread: %thread%newlineDate: %date%newlineNDC: %property{NDC}%newline%newline" /> 
    </layout> 
    <threshold value="DEBUG" /> 
</appender> 
+0

@Brian - Merci pour la réponse. Oui - je * pourrais * mais le problème est que j'ai plusieurs types. Adopter une approche de liste blanche pour la journalisation rendrait ma configuration de journalisation énorme et difficile, ce qui explique pourquoi je m'interrogeais sur une approche de liste noire. –

+0

Compris. Je donnais juste une approche possible en fonction du nombre d'autres enregistreurs que vous avez définis. J'ai mis à jour ma réponse pour suggérer de définir un seuil au niveau de l'appender. Il vous suffit ensuite de modifier la bibliothèque tierce pour utiliser un appender avec le seuil approprié, alors que votre appender est toujours défini sur DEBUG. –

+0

@Brian - merci pour la suggestion dans tous les cas - c'est une bonne approche si vous avez seulement quelques enregistreurs. En ce qui concerne votre deuxième partie de la suggestion - dans mon cas, je veux que les deux vont à la même cible (un seul fichier journal, ou une fenêtre de console). Cette approche fonctionnerait-elle toujours là? –