2009-07-23 14 views
8

Sto tentando di impostare una libreria di registrazione comune che determina l'istanza ILog in base allo stack corrente e quale è l'istanza migliore di ILog da utilizzare.Appendici diversi per spazio dei nomi

Ho il mio config impostare in questo modo:

<log4net> 
    <!-- appenders omitted --> 
    <root></root> 

    <logger name="MyAssembly.MyNamespace"> 
    <level value="WARN" /> 
    <!-- appender list --> 
    </logger> 
</log4net> 

e ho una classe come questa:

namespace MyAssembly.MyNamespace.SubNamespace { 
    public class MyClass { ... } 
} 

Quando provo e ottenere un'istanza di ILog passo nella digita (var log = LogManager.GetLogger(typeof(MyClass)).Namespace);) e voglio che rilevi che non c'è nessun logger configurato, quindi salirà di un livello nell'albero dei nomi (a MyAssembly.MyNamespace) e poi vedrà se è configurato in quel punto.

Il problema è che il ILog restituito per MyAssembly.MyNamespace.SubNamespace è configurato per eventi WARN (e sopra), essenzialmente ciò che ho configurato per il suo genitore. Log4net sembra restituire ILog quando il nome richiesto contiene un nome definito, piuttosto che quando è uguale a il nome.

Come posso ottenere che Log4net restituisca un logger valido valido quando il nome è uguale a quello definito nella configurazione?

+0

forse Dipendenza Iniezione dell'istanza del logger sarebbe un design migliore? –

+0

@Mitch Wheat: Vero usando qualcosa come MEF sarebbe bello, ma abbiamo un'implementazione DI-less che sto solo cercando di modificare –

risposta

10

log4net considera i logger come esistenti in una gerarchia in base al loro nome, quindi il logger con nome MyAssembly.MyNamespace.SubNamespace è figlio del registratore con nome MyAssembly.MyNamespace.

Se per un logger non è specificato alcun livello (WARN ecc.), Il sistema attraversa la gerarchia del logger fino a quando non trova un logger con un livello configurato e diventa il livello effettivo per quel logger.

Nel tuo caso, il registratore figlio non ha alcun livello specificato, quindi eredita il livello del suo genitore - WARN. Se si specifica

<logger name="MyAssembly.MyNamespace.SubNamespace"> 
    <level value="DEBUG" /> <!-- or whatever --> 
    <!-- no need to specify appenders, will use parent's --> 
</logger> 

quindi si otterrà l'output di debug dal logger bambino (inviato ai appenders configurati per il genitore).

Problemi correlati