È possibile trovare molte informazioni su log4net e NLog sia qui su StackOverflow che su googling in generale.
È inoltre possibile trovare molte informazioni su System.Diagnostics. Una cosa da notare su System.Diagnostics, penso che su StackOverflow troverai molti riferimenti sull'uso di Debug.Write/WriteLine e Trace.Write/WriteLine. Un modo forse "migliore" è usare TraceSources. TraceSources sono analoghi ai logger in log4net e NLog. TraceSources ti consente di avere un grado più elevato di granularità per i tuoi messaggi di registrazione, rendendo più semplice accendere alcuni logging e altri off (per classe o categoria, oltre per livello). TraceSources presenta uno svantaggio, rispetto a log4net e NLog, in quanto ogni TraceSource creata nel codice deve essere configurata in modo esplicito in app.config (se si desidera che registri effettivamente).
log4net e NLog hanno un concetto gerarchico in cui se il logger esatto richiesto non è configurato in modo esplicito, il suo "ancestry" viene controllato per vedere se sono stati configurati eventuali "antenati" e, in tal caso, il logger richiesto "eredita" quelle impostazioni. Gli antenati sono semplicemente le parti del nome del logger delimitato da ".". Quindi, se si richiede un logger chiamato "ABC.DEF.GHI"
, gli antenati sarebbero "ABC.DEF"
e "ABC"
. È anche possibile (richiesto?) per avere una configurazione del logger "root" nell'app.config che tutte le richieste di logger ricadranno su se non sono configurate esplicitamente e non sono stati configurati antenati. Pertanto, è possibile configurare solo un logger "root" per accedere a un determinato livello e tutti i logger del proprio codice si collegheranno a tale livello. In alternativa, è possibile configurare il logger "root" su "off" e quindi attivare uno o più logger esplicitamente (o configurando un antenato). In questo modo, nessun registratore registrerà EXCEPT per quelli che sono configurati.
Se si guarda here, si troverà un involucro interessante attorno a System.Diagnostics TraceSources che fornisce una capacità di ereditarietà molto simile a log4net e NLog.
Facciamo un esempio:
Un modello di utilizzo comune per logger in log4net e NLog è quello di ottenere un logger come questo:
//log4net
static ILog logger = LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
//NLog
static Logger logger = LogManager.GetCurrentClassLogger();
In entrambi i casi il nome del registratore sarà il nome di tipo completo.
Nel file app.config, è possibile, se lo si desidera, configurare solo il logger "root" ed entrambi i logger erediteranno le impostazioni del logger root (livello, appenders/target, ecc.). In alternativa è possibile configurare un logger per alcuni spazi dei nomi. Qualsiasi logger il cui tipo è definito in quel namespace erediterà quelle impostazioni del logger.
Basta con log4net e NLog, probabilmente già sai come funzionano.
Il collegamento sopra illustra un wrapper basato su TraceSource che consente una configurazione simile. Quindi, se si voleva, si potrebbe fare qualcosa di simile nelle classi:
static TraceSource ts = new TraceSource(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
Con l'involucro linkato sopra, si potrebbe configurare un TraceSource a un livello superiore (classe/spazio dei nomi gerarchico-saggio, non a livello) e ereditare quelle impostazioni nei logger di livello inferiore.
Quindi, se il nome del tipo completo è simile a questo: ABC.DEF.GHI, è possibile configurare un TraceSource per ABC o ABC.DEF (livello spazio dei nomi) e la classe "GHI" erediterà le impostazioni. Questo potrebbe davvero ridurre la quantità di configurazione che devi fare.
Si noti che non si è limitato (con nessuna di queste piattaforme di registrazione) all'utilizzo del nome del tipo o del tipo della classe per ottenere il registratore. È possibile definire il proprio schema di denominazione del logger, possibilmente basato su aree funzionali ("Comunicazione", "Comunicazione.Invia", "Comunicazione.Ricezione", ecc.). Anche in questo caso, è possibile richiedere un logger/TraceSource al massimo grado di granularità (o meno) e quindi configurare a qualunque livello di granularità abbia senso.
Quindi, si potrebbe richiedere logger nel codice come questo:
ILog logger = LogManager.GetLogger("Communication.Receive");
ILog logger = LogManager.GetLogger("Communication.Send");
Logger logger = LogManager.GetLogger("Communication.Receive");
Logger logger = LogManager.GetLogger("Communication.Send");
TraceSource ts = new TraceSource("Communication.Receive");
TraceSource ts = new TraceSource("Communication.Send");
Se si configura solo "comunicazione" nel file app.config, quindi tutti i logger erediteranno le impostazioni (dal momento che sono discendenti di "Comunicazione"). Se si configura solo "Commuincation.Receive", verranno registrati solo i logger "Communication.Receive". I logger "Communication.Send" saranno disabilitati. Se si configura sia "Comunicazione" che "Comunicazione", i registratori "Comunicazione.Ricezione" registreranno le impostazioni "Comunicazione.Ricezione" mentre i logger "CommunicationSender" effettueranno il log nelle impostazioni "Comunicazione". In log4net e NLog possono esserci più ereditarietà di questo, ma non ne so abbastanza per approfondire.
Una cosa che ti manca quando usi System.La diagnostica è la flessibilità per formattare il formato di output di registrazione molto facilmente. Esiste una libreria di terze parti che fornisce una formattazione configurabile molto bella per la registrazione basata su TraceSource. Lo puoi trovare here.
Ho usato Common.Logging alcuni. Principalmente nella prototipazione, ma potrei usarlo nel nostro prossimo progetto. Funziona abbastanza bene ed è relativamente facile scrivere la propria astrazione di logging per collegarlo (come se si volesse scrivere un'astrazione di TraceSource simile a quella che ho linkato sopra). Due cose importanti che mancano da Common.Logging in questo momento (anche se il loro sito dice che sono programmate per la "prossima" versione) sono i contesti di log (come log4net e NDog/MDC/GDC e System.Diagnostics.CorrelationManger.LogicalOperationStack) e compatibilità Silverlight. Puoi ancora interagire con gli oggetti di contesto log4net o NLog nel tuo codice mentre usi Common.Logging, ma questo tipo di sconfigge lo scopo di esso, non è vero?
Non so se ho aiutato o no!
Ecco alcuni punti principali che vorrei fare circa log4net, NLog, e TraceSource:
log4net - molto popolare, probabilmente ha bisogno di alcuni aggiornamenti - almeno in costruzione su .NET 4.0, ultima release pochi anni fa, molto flessibile.
NLog - molto simile a log4net per molti aspetti, nuova versione ora (beta di NLog 2,0 appena uscito)
TraceSource - nessuna terza dipendenza parti, senza qualche sforzo da parte vostra (o qualcun) non potente come log4net o NLog (carenze chiave - gerarchia del logger, formattazione dell'output - entrambi facilmente indirizzabili tramite un link sopra), Microsoft utilizza molti dei suoi componenti con System.Diagnostics in modo da poter ottenere l'output di registrazione di Microsoft e l'output di registrazione intercalato. (In genere, è abbastanza facile acquisire System.Diagnostics in altri sistemi di registrazione, quindi potrebbe non essere un problema enorme).
Anche se non ho usato molto né log4net né NLog, tra i due mi piacerei indirizzare verso NLog, principalmente a causa della nuova versione appena uscita (beta). Penso che TraceSource sia anche una scelta ragionevole, se più rudimentale, soprattutto se si implementa la gerarchia del logger e si utilizza la libreria Ukadc.Diagnostics collegata in precedenza.
Oppure utilizzare Common.Logging ed è possibile evitare o ritardare la decisione per la piattaforma di registrazione sottostante finché non si è pronti. Un aspetto molto utile di Common.Logging, a mio avviso, è che è possibile "testare" le piattaforme di registrazione mentre si sta sviluppando il prodotto senza dover modificare alcun codice dell'applicazione. Non devi aspettare fino a quando non hai deciso su una piattaforma di registrazione specifica per aggiungere la registrazione al tuo codice. Aggiungilo ora tramite l'API Common.Logging. Quando ti avvicini alla consegna, dovresti restringere la scelta della piattaforma di registrazione. Consegnare con quella piattaforma (se si ridistribuisce la piattaforma di registrazione) e il gioco è fatto. Puoi ancora cambiare in seguito, se lo desideri.
Is non System.Diagnostics.Debug/Trace rilevante solo (o anche compilato nel codice) ogni volta che le costanti DEBUG/TRACE sono incorporati nel codice (vale a dire un debug, non un rilascio, costruire)? Quindi il vantaggio derivante dall'utilizzo di S.D.Debug è piuttosto ridotto rispetto a un framework di registrazione completo. – Andreas
Come noto, S.D.Debug funziona solo quando si crea l'applicazione in modalità di debug, ma se la si genera in modalità di rilascio, si ottengono solo i messaggi registrati con S.D.Trace (che sembra quasi lo stesso di Debug). – timurso