2009-07-23 9 views
12

J'ai configuré un logfileAppender et un consoleAppender dans ma configuration log4net pour mon application. Je voudrais que l'appender logfile écrive seulement les messages ERROR et au-dessus et l'appender de console pour écrire DEBUG et au-dessus.Le seuil de l'appendeur Log4net ne fonctionne pas

Ma config est:

<log4net debug="false"> 

<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" > 
    <param name="File" value="log.txt" /> 
    <param name="AppendToFile" value="true" /> 
    <layout type="log4net.Layout.PatternLayout,log4net"> 
    <param name="ConversionPattern" value="%d %M - %m%n" /> 
    </layout> 
    <threshold value="ERROR"/> 
</appender> 

<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" > 
    <layout type="log4net.Layout.PatternLayout"> 
    <param name="ConversionPattern" value="%d %m%n" /> 
    </layout> 
</appender> 


<root> 
    <priority value="DEBUG" /> 
    <appender-ref ref="ConsoleAppender" /> 
    <appender-ref ref="LogFileAppender" /> 
</root> 

</log4net> 

Je trouve que les deux ERROR et DEBUG est émis vers mon logfile appender. Comment limiter à seulement ERREUR?

+0

Avez-vous essayé le filtre je l'ai suggéré dans ma réponse ? Cela n'a-t-il fait aucune différence? –

+0

J'ai créé un exemple d'application console en utilisant votre configuration log4net et j'obtiens le comportement exact que vous semblez vouloir ... voir ma réponse ci-dessous. – Darragh

Répondre

8

Notez également que la balise level dans l'enregistreur ne fonctionne pas de la même manière que threshold ou LevelMatchFilter.

Level indique les instructions de journal qui seront réellement générées. C'est ce que vous pouvez tester dans votre code. D'autre part, filtre tous les messages de journal qui sont inférieurs à votre seuil. Cela signifie que le fait d'avoir un seuil supérieur au niveau de journalisation le plus élevé n'a aucun sens. J'ai vu à plusieurs reprises comment on définit un niveau d'INFO (parce que c'est ce que la plupart des utilisateurs utiliseront), et ensuite créer un appender qui a un seuil de DEBUG. Et puis vous êtes surpris quand aucun message DEBUG n'apparaît réellement sur l'appender ...

6

Pour obtenir un filtrage très spécifique pour un appender, vous devez configurer un LevelMatchFilter ou un LevelRangeFilter pour l'appender du fichier journal afin de filtrer les événements réellement sortis.
Par exemple:

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

ou

<filter type="log4net.Filter.LevelMatchFilter"> 
    <levelToMatch value="ERROR"/> 
</filter> 

mettre un de ces intérieur de votre étiquette <appender>, et cela devrait fonctionner pour vous:

<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" > 
    <filter type="log4net.Filter.LevelMatchFilter"> 
     <levelToMatch value="ERROR"/> 
    </filter> 
    <param name="File" value="log.txt" /> 
    <param name="AppendToFile" value="true" /> 
    <layout type="log4net.Layout.PatternLayout,log4net"> 
     <param name="ConversionPattern" value="%d %M - %m%n" /> 
    </layout> 
    <threshold value="ERROR"/> 
</appender> 

Note: Mise à jour pour supprimer erreur a par kgiannakakis.

+0

@ Dav.evans, pouvez-vous confirmer que ce qui précède est la configuration complète? Quels enregistreurs utilisez-vous? Est-il certain qu'aucune modification de configuration n'est effectuée par programmation dans votre code? –

+0

même question/réponse: http://stackoverflow.com/questions/6007/log4net-configuring-log-level –

0

Vous devez utiliser la propriété additivity. Voir here pour un exemple. Vous devez définir deux enregistreurs.

+0

Mais logfile est un Appender, et l'additivité concerne les Loggers. –

+0

J'ai corrigé cela. Vous créez en fait deux enregistreurs, chacun avec un appender et utilisez la propriété additivity. – kgiannakakis

+0

sûrement pas. Quel est le but de l'élément seuil alors? –

2

Les réponses que vous recevez sont partiellement correctes. Le Threshold est uniquement utilisé pour définir une limite inférieure au niveau ajouté. Un seuil d'ERROR recevra en réalité ERROR et FATAL (qui est "above" ERROR).

Vous souhaitez implémenter un LevelMatchFilter avec une valeur de niveau "ERROR" (et "DEBUG" pour l'autre appender). Cependant, vous devez également ajouter un DenyAllFilter à la fin de votre chaîne de filtres.
Par exemple:

<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" > 
    <param name="File" value="log.txt" /> 
    <param name="AppendToFile" value="true" /> 
    <layout type="log4net.Layout.PatternLayout,log4net"> 
    <param name="ConversionPattern" value="%d %M - %m%n" /> 
    </layout> 
    <filter type="log4net.Filter.LevelMatchFilter"> 
    <levelToMatch value="ERROR" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
</appender> 

J'ai dû mettre en œuvre le DenyAllFilter depuis log4net 1.2.10 (vous pouvez voir la question que j'avais sur ce sujet here).

+0

Maestrean Cela ne fonctionne pas pour moi avec la dernière version de log4net. – BradLaney

+0

J'ai utilisé ceci et cela a fonctionné dans la version 1.2.13.0. –

4

J'ai créé un exemple d'application console en utilisant votre configuration log4net et j'obtiens le comportement exact que vous semblez vouloir ...

using System; 
using System.IO; 
using log4net; 
using log4net.Config; 

namespace SO_1171258 
{ 
    class Program 
    { 
     private static readonly ILog log = LogManager.GetLogger(typeof(Program)); 

     static void Main() 
     { 
      XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString())); 
      log.Error(new Exception("error log statment")); 
      log.Debug("debug log statment"); 
     } 
    } 
} 

Quand je lance cette application, la seule chose dans le fichier journal est:

2014-01-27 15: 02: 51387 Main - System.Exception: erreur journal statment

Et à l'écran, je vois:

2014-01-27 15: 05: 52190 System.Exception: erreur journal statment

27/01/2014 15: 05: 52218 débogage journal statment

Voici l'intégralité de mon fichier app.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> 
    </configSections> 
    <log4net debug="false"> 

    <appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" > 
     <param name="File" value="log.txt" /> 
     <param name="AppendToFile" value="true" /> 
     <layout type="log4net.Layout.PatternLayout,log4net"> 
     <param name="ConversionPattern" value="%d %M - %m%n" /> 
     </layout> 
     <threshold value="ERROR"/> 
    </appender> 

    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" > 
     <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%d %m%n" /> 
     </layout> 
    </appender> 


    <root> 
     <priority value="DEBUG" /> 
     <appender-ref ref="ConsoleAppender" /> 
     <appender-ref ref="LogFileAppender" /> 
    </root> 

    </log4net> 
</configuration>