【问题标题】:log4net traceappender only logs messages with level 'verbose' when using Windows Azure DiagnosticsMonitorlog4net traceappender 仅在使用 Windows Azure DiagnosticsMonitor 时记录级别为“详细”的消息
【发布时间】:2017-09-20 22:05:23
【问题描述】:

我有一个 azure worker 角色,我已将其配置为使用写入 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>

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

如何解决这个问题?

【问题讨论】:

  • 这已经过时了。例如,请参阅blog.kloud.com.au/2014/10/22/…
  • 你确定吗?人们似乎仍然在使用 Microsoft.WindowsAzure.Diagnostics 2.5.0.0 遇到这个问题
  • 嗯:/不,我不确定。

标签: c# azure log4net azure-diagnostics


【解决方案1】:

有几篇博文讨论了这个问题:(herehere

  • 原来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>

【讨论】:

  • 非常有用。但是,我没有通过Trace.Write() 从 log4net 获得调试级别消息。我将代码调整为else if (level &gt;= Level.Debug),现在在我的流式日志和表存储中看到调试级别消息。
  • 是的,它非常有用。一条评论:一个简单的 Trace.Write(..) 不会显示在 Azure 流日志中,所以最后的 else 分支什么都不做。我们必须将 5 个级别的 log4net 消息明确地投影到 3 个级别的 Trace。
  • 我有Microsoft.WindowsAzure.Diagnostics 2.5.0.0,但仍然是同样的问题。你的回答解决了它。
  • 正如@g.pickardou 指出的那样,Trace.Write() 不会显示在 azure 流日志中。但是, Trace.WriteLine() 确实显示为详细级别的日志记录。 5 个 log4net 级别到 4 个 azure 级别比转到 3 个 azure 级别要容易得多
  • @g.pickardou & josh:更新了 TraceAppender 代码。感谢您指出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 2011-04-07
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多