使用Windows Azure DiagnosticsMonitor时,log4net traceappender仅记录级别为“详细”的消息

我有一个azure worker角色,我已将其配置为使用log4net Trace Appender写入WindowsAzure.Diagnostics。 这是通过在worker角色的RoleEntryPoint中进行以下调用来完成的。

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

App.config文件按以下方式配置:

                     

结果是所有消息(甚至错误)都作为“详细”级别记录在表存储中。

如何解决这个问题?

一些博客文章处理这个问题:( 这里和这里 )

  • 事实certificate,log4net TraceAppender将所有日志消息转换为Trace.Write消息,并且DiagnosticMonitorTraceListener将所有Trace.Write消息转换为详细信息。

我的答案是使用Pete McEvoy的解决方案并以下列方式扩展TraceAppender:

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

然后在我的App.config中实现此扩展: