Лесозаготовительный комплекс в замке Виндзор NLog - информация о сайте - PullRequest
1 голос
/ 29 февраля 2012

Я экспериментирую с Windsor Logging Facility в качестве оболочки для NLog. Кажется, все работает нормально, за исключением того, что информация callsite отправляет имена класса и метода-оболочки вместо фактической информации о вызывающем. Из основного поиска это звучало как очевидная вещь, но я не мог найти решение этого. Есть мысли?

Я добавил объект в контейнер:

   container.AddFacility<LoggingFacility>(f => f.UseNLog());

В моем классе есть открытое свойство, и я создаю экземпляр класса с помощью контейнера.

    private ILogger logger = NullLogger.Instance;
    public ILogger Logger
    {
        get
        {
            return logger;
        }
        set
        {
            logger = value;
        }
    }

И мой NLog.config настроен на передачу информации о месте вызова:

      ${callsite: className=true: fileName=true: includeSourcePath=true: methodName=true}

1 Ответ

1 голос
/ 29 февраля 2012

Мне кажется, что оболочка Castle NLogLogger, которая обертывает объект NLog Logger, не реализована, поэтому информация о месте вызова сохраняется.См. эту ссылку в репозиторий Castle для реализации оболочки.

Для полноты здесь приведен сокращенный пример реализации Castle:

public class NLogLogger : ILogger
{
  public NLogLogger(Logger logger, NLogFactory factory)
  {
    Logger = logger;
    Factory = factory;
  }

  internal NLogLogger() {}

  public bool IsDebugEnabled
  {
    get { return Logger.IsDebugEnabled; }
  }
  public void Debug(string message)
  {
    Logger.Debug(message);
  }
}

Ключпроблема заключается в том, что метод «Debug» (все остальные методы ведения журнала) использует соответствующие методы объекта NLog Logger.Методы ведения журнала в NLog Logger используют вызывающую функцию / метод в качестве сайта вызова (это не на 100% правильно, но это эффективно, что происходит в этом случае).Таким образом, в случае этой оболочки, сайт вызова будет реализацией оболочки NLog.Одним из правильных способов написания оболочки, чтобы сохранить сайт вызовов, является использование метода Log в NLog Logger, передавая Тип оболочки в качестве первого параметра.NLog будет подниматься вверх по стеку, пока тип MethodInfo не станет таким же, как тип, переданный в метод Log.Следующим методом в стеке будет сайт вызова.

Для правильного хранения информации сайта вызова метод отладки должен выглядеть примерно так:

public void Debug(string message)
{
  LogEventInfo logEvent = new LogEventInfo(LogLevel.Debug, Logger.Name, message);
  Logger.Log(typeof(NLogLogger), logEvent);
}

См. Эти ссылки наОтветы, которые я опубликовал в прошлом, о правильной упаковке Logler NLog так, что информация о сайте вызова сохраняется:

Как сохранить информацию о месте вызова при упаковке NLog

Nlog Callsite неверен, когда используется обертка

См. Также эту ссылку на исходный репозиторий NLog для некоторых примеров того, как расширить Logger NLog.

...