2009-11-05 6 views
8

Sto utilizzando log4net e in una classe richiede la registrazione a un appender di RollingFile, ma in un'altra classe, desidero accedere al registro eventi + rolling file + appender della console.accesso a log4net a diversi appendici in base alle circostanze

Qual è la migliore pratica? e potrei vedere qualche codice di esempio?

A proposito di rendere le cose più difficili, sto usando Castle Windsor Logging Facility con Log4net per risolvere l'istanza di Logger.

Se serve, ciò pensavo di seguito, ma non ho idea se questo è delle migliori pratiche, o come attivare un particolare registratore sulla base di 'nome' ancora utilizzando il mio esempio logger corrente da 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> 
... 

castello di Windsor classe contenitore builder:

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

classe in cui registrare:

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

Grazie ragazzi.

+0

Qui è possibile trovare un modo per creare un'istanza di Logger denominata [tip] (http://kenegozi.com/blog/2009/12/11/windsorrsquos-logging-facility-getting-a-named-instance) –

risposta

12

È possibile farlo applicando un filtro a un appender. Solo se l'evento di log passa il filtro, l'evento viene registrato da quell'appender.

Questa configurazione del filtro registrerà solo quegli eventi provenienti dal logger chiamato "myLogger":

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

... e questo corrisponderà i messaggi di log con alcuni testo contenuto:

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

C'è un bel po 'di configurazione possibile con i filtri. Vedere lo log4net SDK o la sezione Filtri di manual, per ulteriori dettagli.

+0

Grazie Michael, ma non sono ancora sicuro di come accedere al mio Logger per nome. Utilizzando la funzione di registrazione di Castle Windsor, non istanziamo una nuova istanza utilizzando LogManager.GetLogger ("loggerName"), un'istanza viene passata per me. – GONeale

+0

Hai letto i link nella mia risposta? C'è molto che puoi filtrare oltre al nome del logger. –

+0

Scusa, sì capisco che stai parlando di filtri, ma per iniziare a far funzionare questo appender, ho pensato che dovevo ancora accedere al registratore per nome. Come faccio a prelevare l'appender? L'utilizzo di attorno agli appenders funzionava prima, dovrei provare a racchiudere questo appender filtrato in, invece di un logger con nome effettivo? – GONeale