Come accennato in precedenza, NLog e log4net sono entrambi buoni quadri di registrazione. Come sopra menziona Jeff, System.Diagnostics è anche una scelta ragionevole (per qualcosa di più della semplice registrazione al registro eventi). Cercando di aggiungere un valore alla mia risposta, piuttosto che solo ripetere a pappagallo ciò che è già stato detto, è possibile migliorare la registrazione System.Diagnostics utilizzando TraceSources e utilizzando lo Ukadc.Diagnostics library from codeplex gratuito.
Con TraceSources è possibile creare "logger denominati", in modo simile a come è possibile farlo in NLog e log4net. Queste TraceSources possono essere configurate per il log a determinati livelli (variabili per TraceSource) e possono essere inviate a varie destinazioni (TraceListeners). Tutti i TraceSources possono accedere allo stesso listener o alcuni possono accedere ad alcuni listener mentre altri si collegano ad altri listener. Qualsiasi TraceSource può anche essere inviata a più TraceListeners.
Ecco come utilizzare TraceSources nel codice (si presuma che TraceSource "abc" sia stato configurato nel file app.config per registrare "Info" e messaggi con priorità più alta ed è stato configurato per accedere al file "log". testo").
public class MyClass
{
static TraceSource ts = new TraceSource("abc"); //Common idiom for NLog and log4net, not sure if as common for TraceSource
public void Func1(int x)
{
ts.Information("Entering Func1");
ts.Verbose("x = {0}", x); //Won't log if "abc" is configured to log Info and HIGHER messgaes
ts.Information("Exiting Func1");
}
}
Un enorme vantaggio di Ukadc.Diagnostics, oltre TraceSources "semplice", è che è possibile configurare la formattazione dell'output NLog/stile log4net così si può avere molto più controllo su ciò che i campi appaiono nel vostro output di registrazione e quello che formato.
Tre cose che sono abbastanza utili da NLog/log4net che non sono disponibili in System.Diagnostics sono:
Possibilità di registrare automaticamente le informazioni sito di chiamata (metodo/funzione)
registrazione supplementare contesto (GDC - proprietà globali di registrazione, MDC - proprietà di registrazione del thread in linguaggio NLog/log4net). System.Diagnostics ha Trace.CorrelationManager.LogicalOperationStack, che è simile a NDC.
Taglialegna gerarchica.
logger Hierarichical significa che si potrebbe configurare un logger "antenato" e qualsiasi "discendente" logger erediteranno quelle impostazioni. Ad esempio, si supponga di avere una classe il cui nome di tipo completo (nome spazio) completo sia Namespace1.Namespace2.Class. Con NLog/log4net è possibile configurare le informazioni di registrazione (livello, destinazione) per "Namespace1" e se si è richiesto un programma di registrazione basato sul nome completo di qualsiasi tipo in Namespace1, esso erediterà le impostazioni di Namespace1. È possibile ottenere qualcosa di simile a questo utilizzando TraceSources esaminando come astrazione Castle implemented their TraceSource-based logging. In particolare, guarda la funzione Initialize. È piuttosto facile lavorare (nel proprio involucro sottile attorno a TraceSource) e, come vantaggio collaterale, rende la configurazione di TraceSources un po 'più semplice dato che non è necessario configurare ogni singola TraceSource singolarmente. Si noti che è possibile aggiungere facilmente la possibilità di avere una configurazione "root" configurando una TraceSource chiamata "" e aggiungendo del codice nello schema Castle per l'impostazione predefinita alla configurazione "" se non si trovano veri antenati. Ad esempio, è possibile configurare "*" per accedere, ad esempio Verbose, e quindi configurare in modo specifico determinate TraceSources (per classe o per spazio dei nomi) da disattivare o su un livello diverso. Senza logger gerarchici, fare lo stesso con TraceSources avrebbe richiesto di configurare ogni singola TraceSource per accedere a "Verbose" che si desidera a verbose.
Mentre ho parlato molto dei logger per classi e spazi dei nomi, NLog, log4net e TraceSources consentono anche di definire i nomi dei logger come stringhe arbitrarie. Come tale, è freddo definire una gerarchia logger per area funzionale piuttosto che dal namespace/classe:
Database
Database.Connect
Database.Query
Database.Update
Database.SQL
Amazon
Amazon.Books
Amazon.Books.Fiction
Amazon.Books.Nonfiction
Amazon.Electronics
Amazon.Electronics.Video
Amazon.Electronics.Music
Amazon.Electronics.Computer
Quindi, si potrebbe attivare la registrazione "Amazon" e tutti log Amazon roba (senza dover configurare esplicitamente ogni "child" TraceSource) e roba di database non lo farebbero. Oppure, puoi disattivare Amazon e Amazon.Electronics e solo Amazon.Books (e i suoi figli) registreranno.
Infine, se si utilizza NLog o log4net, vale la pena ricordare che NLog ha appena realizzato una nuova versione, NLog 2.0, (in versione beta).
+1 per il punto di sicurezza del thread, sebbene solo il thread principale trasmetta eventi di registro. Grazie per la tua risposta completa. –