2013-05-30 31 views
7

Recentemente mi sono imbattuto in log4net grazie a un utente qui. Ad ogni modo, desidero registrare ogni Console.Write() e Debug.Write() automaticamente nel singolo file di registro che ho configurato. Inoltre, io uso molte librerie di classi che hanno anche istruzioni Console/Debug che non sanno nulla di log4net. Questi possono anche essere registrati automaticamente nel file di log in base alla configurazione? Tutto ciò è possibile?log4net Registrazione di Debug.WriteLine e Console.WriteLine

What I Want registrato nel file di registro di laminazione:

Console.WriteLine("console statement"); 
Debug.WriteLine("debug statement"); 

Instantiate Logger:

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 
private static void InitializeLogger() 
{ 
    XmlConfigurator.Configure(); 
} 

Tutto l'app.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    </configSections> 

    <log4net> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <param name="File" value="SubToolsPortServerTest.log"/> 
     <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="2" /> 
     <maximumFileSize value="1MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n"/> 
     </layout> 
    </appender> 

    <root> 
     <level value="ALL" /> 
     <appender-ref ref="LogFileAppender" /> 
    </root> 
    </log4net> 
</configuration> 

risposta

7

È possibile reindirizzare Debug.WriteLine (a eseguire il debug build) e Trace.WriteLine a log4net scrivendo una custom TraceListener che registra su log4net. I bit salienti di un'implementazione semplicistico saranno simili:

public class Log4NetTraceListener : TraceListener 
{ 
    ILog _logger = ...; 

    public override void WriteLine(string message) 
    { 
     _logger.Info(message); 
    } 
} 

Si potrebbe quindi configurare questo nel file di configurazione dell'applicazione qualcosa di simile:

<system.diagnostics> 
    ... 
    <listeners> 
     <add name="traceListener" type="MyNamespace.Log4NetTraceListener,MyAssembly" /> 
    </listeners> 
    ... 
</system.diagnostics> 

Un'implementazione più completa potrebbe supportare la configurazione del nome del logger , il livello di registrazione da utilizzare e forse un certo buffering interno dei messaggi.

Per Console.WriteLine si potrebbe reindirizzare a tue TextWriter chiamando Console.SetOut, e la vostra abitudine TextWriter potrebbe accedere a log4net.

+0

Joe, accetto la risposta in cui risponde alla mia domanda riguardante l'emissione di Debug e Console.WriteLines su log4net. Tuttavia, ho trovato più facile aggiungere log4net a ciascun progetto e modificare le istruzioni di debug. Grazie. – JMooney

+0

Qualcuno ha problemi di deadlock dell'esperienza? – dmarlow

Problemi correlati