2010-05-05 16 views
24

Ho un'applicazione composta da un host e moduli collegabili (plug-in).log4net - configura utilizzando più file di configurazione

Desidero poter configurare log4net per l'host e per ciascuno degli altri moduli. Ognuno di essi dovrebbe avere il proprio file di configurazione e ognuno si collegherà a un altro file.

Solo l'host ha un file App.config. I plugin hanno il loro proprio file di configurazione contenente le sezioni di configurazione di log4net.

La chiamata di XmlConfigurator.Configure da uno dei plug-in sovrascrive le definizioni di app.config log4net dell'host.

C'è un modo semplice per aggiungere configurazioni invece di sovrascriverle?

Grazie, Gai.

risposta

2

Mi sono imbattuto in questo problema. Anche se non è esattamente ciò che definirei "ideale", penso che la soluzione migliore al momento sia quella di utilizzare il metodo della classe XmlConfigurator. Fondamentalmente, l'assembly host ha configurato la configurazione log4net utilizzando un file di configurazione specifico. Quando i plugin vengono caricati, invitali a scrivere i loro elementi di configurazione nella sezione di configurazione log4net nello stesso file di configurazione. Poiché a log4net è stato detto di guardare quel file per le modifiche con ConfigureAndWatch, quando il file ha aggiunto i nuovi dati, log4net ricaricherà la configurazione che ora includerà gli elementi di configurazione dai plug-in.

Questo è un po 'hacker, ma sembra funzionare. Il prossimo passo, naturalmente, lo sposteremo nel mio framework di logging in modo che l'accesso al file di configurazione sia federato.

Si noti che c'è un breve ritardo tra la configurazione del plug-in che viene scritta/salvata e la configurazione aggiornata che viene ricaricata e applicata al repository del logger.

+0

Grazie Stuart, darò una prova. – Gai

16

Sembra che tu abbia già trovato una soluzione che funziona per te. Tuttavia, ho trovato una soluzione diversa che considero "più ideale", quindi la posterò qui per chiunque possa trovare questa domanda in futuro.

log4net ha un concetto chiamato repository che può essere configurato separatamente. Non è molto popolare né molto ben documentato, ma ecco alcuni documenti che ho trovato:

http://logging.apache.org/log4net/release/manual/repositories.html

In ogni caso, tutto quello che dovete fare è aggiungere RepositoryAttribute sul montaggio o assemblee plugin con un nome repository unico per quella del plugin e log4net lo terrà separato da tutto il resto.

4

Un altro modo è disporre di più file di configurazione di log4net in più posizioni, caricarli tutti in un XDocument per comporne uno singolo e quindi chiamare XmlConfigurator.Configure(). Il modo in cui ho fatto questo è stato quello di creare ogni file seguendo l'XSD per la configurazione, caricare tutti i figli del nodo radice log4net di ogni file in istanze separate XElement e unirle in un nuovo XDocument con un nodo radice log4net. Aggiornerò questa risposta con il codice (non è di fronte a me al momento) se qualcuno è interessato ulteriormente.

Trovare i file è un'altra questione: utilizzare una sorta di convenzione per cercare i file (ad esempio *.dll.log4net.config), incorporarli negli assembly o qualcosa del genere.

Un'implementazione di tale codice può essere trovato su:

www.kopf.com.br/kaplof/using-multiple-configuration-files-with-log4net

+0

Come lo faresti? Sembra una buona soluzione. Sembra non banale dal momento che è necessario mantenere solo un singolo tag "log4net" e unire il contenuto di quel tag. – Wayne

+0

Ho aggiornato la mia risposta con un po 'più di dettaglio. Si scopre di non prendere troppo codice e ne è valsa la pena per avere diverse impostazioni di registrazione per ambiente senza ricorrere a ulteriori passi di costruzione. – Kit

Problemi correlati