log4net traceappender регистрирует только сообщения с уровнем «подробности» при использовании Windows Azure DiagnosticsMonitor.

У меня есть рабочая роль Azure, которую я настроил для использования Log4net Trace Appender, который записывает данные в WindowsAzure.Diagnostics. Это делается путем выполнения следующих вызовов в 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>

В результате все сообщения (даже ошибки) регистрируются в табличном хранилище как «подробный» уровень.

Как это исправить?


person Rune Vejen Petersen    schedule 03.08.2012    source источник
comment
Сейчас это устарело. См. blog.kloud.com.au/2014/10/22/.   -  person Rory    schedule 21.03.2015
comment
Вы уверены? Кажется, люди все еще испытывают эту проблему с Microsoft.WindowsAzure.Diagnostics 2.5.0.0.   -  person Rune Vejen Petersen    schedule 21.01.2016
comment
ммм :/ нет, я не уверен.   -  person Rory    schedule 10.05.2016


Ответы (1)


Несколько сообщений в блоге посвящены этой проблеме: "noreferrer">здесь и здесь)

  • Оказалось, что log4net TraceAppender преобразует все сообщения журнала в сообщения Trace.Write, а DiagnosticMonitorTraceListener преобразует все сообщения Trace.Write в подробные.

В моем случае ответ состоял в том, чтобы использовать решение Пита МакЭвоя и расширить 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>
person Rune Vejen Petersen    schedule 03.08.2012
comment
Очень полезно. Однако я не получал сообщений уровня отладки от log4net через Trace.Write(). Я изменил код на else if (level >= Level.Debug) и теперь вижу сообщения уровня отладки в своих журналах потоковой передачи и хранилище таблиц. - person Jonathan Freeland; 18.03.2014
comment
Да, это было очень полезно. Один комментарий: простой Trace.Write(..) не будет отображаться в журнале потоковой передачи Azure, поэтому последняя ветвь else ничего не делает. Мы должны проецировать 5 уровней сообщений log4net на 3 уровня Trace. - person g.pickardou; 23.04.2015
comment
У меня Microsoft.WindowsAzure.Diagnostics 2.5.0.0, но проблема та же. Ваш ответ решил это, хотя. - person Jaanus; 20.01.2016
comment
как указал @g.pickardou, Trace.Write() не отображается в журнале потоковой передачи Azure. Однако Trace.WriteLine() отображается как протоколирование на подробном уровне. Переход с 5 уровней log4net на 4 уровня azure намного проще, чем переход на 3 уровня azure - person josh; 18.09.2017
comment
@g.pickardou и josh: код TraceAppender обновлен. Спасибо, что указали на это. - person Rune Vejen Petersen; 20.09.2017