2009-11-05 3 views
8

J'utilise log4net et dans une classe, j'ai besoin de me connecter à un applicateur RollingFile, mais dans une autre classe, je souhaite me connecter au journal des événements + fichier roulant + console appender.Connexion de log4net à différents appenders en fonction des circonstances

Quelle est la meilleure pratique? et pourrais-je voir un exemple de code? Par ailleurs, pour rendre les choses plus difficiles, j'utilise Castle Windsor Logging Facility avec Log4net pour résoudre mon instance de Logger.

Si elle aide, je pensais ce ci-dessous, mais ne sais pas si cela est la meilleure pratique, ou comment activer un enregistreur particulier à base de « nom » en utilisant toujours mon instance en cours de l'enregistreur de windsor:

log4net.config:

... 
    <logger name="EventLogOnly"> 
     <level value="ALL" /> 
     <appender-ref ref="EventLogAppender" /> 
    </logger> 
    <logger name="ConsoleEventLog"> 
     <level value="ALL" /> 
     <appender-ref ref="ColoredConsoleAppender" /> 
     <appender-ref ref="EventLogAppender" /> 
    </logger> 
... 

château classe constructeur de conteneurs windsor:

container.AddFacility("logging.facility", 
    new LoggingFacility(LoggerImplementation.Log4net, "log4net.config")); 

classe dans laquelle se connecter:

private ILogger Logger; 
public Test(ILogger logger) { 
    Logger.Info("Can I log under event log only?"); 
    Logger.Info("Now can I log under both?"); 
} 

Merci les gars.

+0

Ici vous pouvez trouver un moyen de créer une instance nommée Logger [Astuce] (http://kenegozi.com/blog/2009/12/11/windsorrsquos-logging-facility-getting-a-named-instance) –

Répondre

12

Vous pouvez le faire en appliquant un filtre à un appender. Ce n'est que si l'événement de journal passe le filtre que l'événement est enregistré par cet appender.

Cette configuration du filtre enregistre uniquement les événements provenant de l'enregistreur nommé "myLogger":

<appender name="EventLogAppender" ... 
    <filter type="log4net.Filter.LoggerMatchFilter"> 
     <loggerToMatch value="MyLogger" /> 
    </filter>  
    <filter type="log4net.Filter.DenyAllFilter" /> 
</appender> 

... et celui-ci va correspondre avec certains messages du journal texte contenu:

<filter type="log4net.Filter.StringMatchFilter"> 
    <stringToMatch value="database" /> 
</filter> 
<filter type="log4net.Filter.DenyAllFilter" /> 

Il y a une bonne configuration possible avec les filtres. Voir le log4net SDK, ou la section Filtres du manual, pour plus de détails.

+0

Merci Michael, mais je ne sais toujours pas comment accéder à mon Logger par son nom. En utilisant la fonction de journalisation dans Castle Windsor, je n'instancie pas une nouvelle instance en utilisant LogManager.GetLogger ("loggerName"), une instance est passée pour moi. – GONeale

+0

Avez-vous lu les liens dans ma réponse? Il y a beaucoup de choses que vous pouvez filtrer en dehors du nom de l'enregistreur. –

+0

Désolé, oui Je comprends que vous parlez de filtres, mais pour commencer à utiliser cet appender, j'ai supposé que j'avais toujours besoin d'accéder à l'enregistreur par son nom. Comment est-ce que j'obtiendrais l'appender pour être ramassé? L'utilisation de autour d'appenders fonctionnait plus tôt, devrais-je essayer d'envelopper cet appendeur filtré, au lieu d'un enregistreur nommé? – GONeale

Questions connexes