2012-08-03 9 views
12

Ho un ruolo di lavoratore azzurro che ho configurato per utilizzare un applet Trace log4net che scrive su WindowsAzure.Diagnostics. Questo viene fatto effettuando le seguenti chiamate nel RoleEntryPoint del ruolo di lavoratore.log4net traceappender registra solo i messaggi con livello 'verbose' quando si utilizza Windows Azure DiagnosticsMonitor

using System; 
using Microsoft.WindowsAzure.Diagnostics; 
using log4net.Config; 

namespace XXX 
{ 
    public class WorkerRole : RoleEntryPoint 
    { 
     public override bool OnStart() 
     { 
      var config = DiagnosticMonitor.GetDefaultInitialConfiguration(); 

      config.Logs.ScheduledTransferLogLevelFilter = LogLevel.Warning; 
      config.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(5); 

      config.WindowsEventLog.DataSources.Add("System!*"); 
      config.WindowsEventLog.DataSources.Add("Application!*"); 
      config.WindowsEventLog.ScheduledTransferLogLevelFilter = LogLevel.Error; 
      config.WindowsEventLog.ScheduledTransferPeriod = TimeSpan.FromMinutes(5); 

      DiagnosticMonitor.Start("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString", config); 

     XmlConfigurator.Configure(); 
     } 
    } 
} 

Il file App.config è configurato nel modo seguente:

<log4net> 
    <appender name="TraceAppender" type="log4net.Appender.TraceAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%logger - %message" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="ALL" /> 
     <appender-ref ref="TraceAppender" /> 
    </root> 
</log4net> 

<system.diagnostics> 
    <trace> 
     <listeners> 
      <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics"> 
       <filter type="" /> 
      </add> 
     </listeners> 
    </trace> 
</system.diagnostics> 

Il risultato di questo è che tutti i messaggi (anche errori) vengono registrati nella memoria tabella come livello "verbose".

Come risolvere il problema?

+0

Questo è ormai obsoleto. Vedere http://blog.kloud.com.au/2014/10/22/logging-with-log4net-and-azure-diagnostics-on-web-and-worker-roles/ per esempio. – Rory

+0

Sei sicuro? Le persone sembrano ancora riscontrare questo problema con Microsoft.WindowsAzure.Diagnostics 2.5.0.0 –

+0

hmmm:/no non sono sicuro. – Rory

risposta

21

Un paio di post di blog che fare con questo problema: (here e here)

  • Si scopre che il TraceAppender log4net converte tutti i messaggi di log per Trace.Write messaggi e che il DiagnosticMonitorTraceListener converte ogni traccia . Scrivi i messaggi a verbose.

La risposta nel mio caso è stato quello di usare la soluzione di Pete McEvoy ed estendere la TraceAppender nel seguente modo:

using System.Diagnostics; 
using log4net.Appender; 
using log4net.Core; 
namespace XXX.Logging 
{ 
    public class AzureTraceAppender : TraceAppender 
    { 
     protected override void Append(LoggingEvent loggingEvent) 
     { 
      var level = loggingEvent.Level; 
      var message = RenderLoggingEvent(loggingEvent); 

      if (level >= Level.Error) 
       Trace.TraceError(message); 
      else if (level >= Level.Warn) 
       Trace.TraceWarning(message); 
      else if (level >= Level.Info) 
       Trace.TraceInformation(message); 
      else 
       Trace.WriteLine(message); 
      if (ImmediateFlush) 
       Trace.Flush(); 
     } 
    } 
} 

Questa estensione è stato poi implementato nel mio app.config:

<log4net> 
    <appender name="AzureTraceAppender" type="XXX.Logging.AzureTraceAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%logger - %message" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="ALL" /> 
     <appender-ref ref="AzureTraceAppender" /> 
    </root> 
</log4net> 
+1

Molto utile. Tuttavia, non ricevevo messaggi di livello di debug da log4net tramite 'Trace.Write()'. Ho modificato il codice in "else if (level> = Level.Debug)" e ora visualizzo i messaggi di livello di debug nei miei registri di streaming e nella memoria della tabella. –

+1

Sì, è stato molto utile. Un commento: un semplice Trace.Write (..) non verrà mostrato nel log di streaming di Azure, quindi il ramo else finale non fa nulla. Dobbiamo proiettare i 5 livelli di messaggi log4net in modo esplicito sui 3 livelli di Trace. –

+0

Ha fatto il trucco! –

Problemi correlati