NLog Custom LayoutRenderer не работает

У меня есть пользовательский LayoutRenderer , определенный следующим образом для NLog в общей сборке:

[LayoutRenderer("appsettings")]
public class AppSettingsLayoutRenderer : LayoutRenderer {
    [DefaultParameter]
    public string Variable {
        get;
        set;
    }

    protected override void Append(StringBuilder builder, LogEventInfo logEvent) {
        if (Variable == null) {
            return;
        }

        var context = HttpContext.Current;

        if (context == null) {
            return;
        }

        builder.Append(Convert.ToString(ConfigurationManager.AppSettings[Variable], CultureInfo.InvariantCulture));
    }
}

Эта общая сборка упоминается в двух проектах, где я реализовал протоколирование.

Первый проект - это веб-сайт ASP.NET/ASP.NET MVC и настроен как веб-сайт верхнего уровня.

Второй проект - проект WCF, в котором размещены несколько служб в IIS и настроен как виртуальный каталог под другим веб-сайтом (веб-сайт по умолчанию в IIS).

Оба содержат следующее в своем Web.config :


  

Оба проекта ссылаются на общую сборку (в которой содержится клиент LayoutRenderer ). Я проверил, что папки bin для обоих проектов на самом деле содержат также сборку DLL. Я подтвердил это через пути, настроенные в IIS.

Наконец, оба проекта содержат следующий файл NLog.config вместе с файлом Web.config :

<?xml version="1.0" ?>


  
    
  

  
    
  

  
    
  

Оба проекта работают под одним и тем же пулом приложений.

Теперь моя проблема:

Для первого проекта журналы отображаются в правильном месте, то есть D: \ Logs \ Logger.Name \ yyyy-MM-dd.log .

Во втором случае журналы отображаются в C: \ Logger.Name \ yyyy-MM-dd.log .

Что происходит? Конфигурация и код включения идентичны, но журналы отображаются в двух разных местоположениях последовательно, один предназначен, а другой непреднамеренно.

Для жизни меня я не понимаю, что происходит.

1
nl ja de
В WCF HttpContext.Current; будет всегда null ... поэтому builder.Append не будет вызываться ... From < href = "http://msdn.microsoft.com/en-us/library/aa702682.aspx" rel = "nofollow noreferrer"> MSDN : HttpContext: текущий всегда имеет значение null при доступе из службы WCF , Вместо этого используйте RequestContext.
добавлено автор nemesv, источник
Я действительно разобрал эту проблему, но я бы отметил ваш комментарий как ответ для ссылки MSDN в HttpContext, всегда являющейся нулевым в WCF. Если хотите, добавьте свой ответ в качестве комментария, чтобы я мог это сделать.
добавлено автор Umar Farooq Khawaja, источник

1 ответы

Вы получаете разные результаты в своих проектах, потому что в WCF HttpContext.Current всегда null ...

Из MSDN :

HttpContext: текущий всегда имеет значение null при доступе из службы WCF. Вместо этого используйте RequestContext.

И из-за вашего

if (context == null) {
    return;
} 

заявление вашего builder.Append не будет вызываться ... поэтому NLog по умолчанию использует базовый стиль LayoutRenderer .

1
добавлено