2012-08-03 24 views
12

Tengo una función de trabajador azul que he configurado para usar un Apilador de seguimiento de log4net que escribe en WindowsAzure.Diagnostics. Esto se hace realizando las siguientes llamadas en RoleEntryPoint de la función de trabajador.log4net traceappender solo registra mensajes con nivel 'verbose' cuando se usa 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(); 
     } 
    } 
} 

El archivo App.config está configurado de la siguiente manera:

<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> 

El resultado de esto es que todos los mensajes (incluso los errores) se registran en el almacenamiento de tablas como el nivel "prolija".

¿Cómo solucionar esto?

+0

Esto ahora está desactualizado. Consulte http://blog.kloud.com.au/2014/10/22/logging-with-log4net-and-azure-diagnostics-on-web-and-worker-roles/, por ejemplo. – Rory

+0

¿Estás seguro? La gente todavía parece estar experimentando este problema con Microsoft.WindowsAzure.Diagnostics 2.5.0.0 –

+0

hmmm:/no, no estoy seguro. – Rory

Respuesta

21

Un par de entradas de blog lidiar con este problema: (here y here)

  • Resulta que el TraceAppender log4net convierte todos los mensajes de registro a Trace.Write mensajes y que la convierte DiagnosticMonitorTraceListener todo rastro . Escribir mensajes para detallado.

La respuesta en mi caso era utilizar la solución de Pete McEvoy y extender la TraceAppender de la siguiente manera:

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(); 
     } 
    } 
} 

Esta extensión fue luego implementado en mi 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

Muy útil. Sin embargo, no recibí mensajes de nivel de depuración de log4net a través de 'Trace.Write()'. Ajusté el código a 'else if (level> = Level.Debug)' y ahora estoy viendo mensajes de nivel de depuración en mis registros de transmisión y almacenamiento de tabla. –

+1

Sí, fue muy útil. Un comentario: un simple Trace.Write (..) no se mostrará en el registro de transmisión de Azure, por lo que la rama else final no hace nada. Debemos proyectar los 5 niveles de mensajes log4net para explícitamente los 3 niveles de Trace. –

+0

¡Lo hizo el truco! –

Cuestiones relacionadas