我有一个天蓝色的辅助角色,我已将其配置为使用写入 WindowsAzure.Diagnostics 的 log4net Trace Appender。这是通过在辅助角色的 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 文件的配置方式如下:
<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>
这样做的结果是所有消息(甚至错误)都以“详细”级别记录在表存储中。
如何解决这个问题?
有几篇博客文章讨论了这个问题:(here http://social.msdn.microsoft.com/Forums/da-DK/windowsazuretroubleshooting/thread/05a82e48-e706-43ca-9364-80aa14784618 and here http://www.dotnetsolutions.co.uk/blog/windows-azure-diagnostics---why-the-trace-writeline-method-only-sends-verbose-messages)
- 原来是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 中实现:
<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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)