Stacktrace, проблема с CallSite на фасадах - PullRequest
1 голос
/ 15 июля 2011

Как логирование фасадов (если они это делают) решает проблему внутренне, так как они добавляют дополнительные фреймы стековой трассировки в контекст записи журнала или скрывают место вызова. Похоже, что в некоторых фасадах (например, простой каркасный фасад ) местом вызова всегда будет сам фасад.

Какие у меня есть потенциальные решения, если я напишу свой собственный фасад регистрации?

1 Ответ

1 голос
/ 15 июля 2011

См. Мой ответ на этот вопрос, где приведен пример написания оболочки для NLog:

Nlog Callsite неверен при использовании оболочки

Чтобы сэкономить время, я скопировал код здесь:

  class NLogLogger : ILogger   
  {     
    private NLog.Logger logger;      
    //The Type that is passed in is ultimately the type of the current object that     
    //Ninject is creating.  In the case of my example, it is Class1 and Class1 is     
    //dependent on ILogger.     
    public NLogLogger(Type t)     
    {       
      logger = NLog.LogManager.GetLogger(t.FullName);     
    }      
    //Trace, Warn, Error, Fatal eliminated for brevity      
    public bool IsInfoEnabled { get { return logger.IsInfoEnabled; } }      

    public bool IsDebugEnabled { get { return logger.IsDebugEnabled; } }      

    public void Info(string format, params object [] args)     
    {       
      if (logger.IsInfoEnabled)       
      {          
        Write(LogLevel.Info, format, args);       
      }     
    }      

    public void Debug(string format, params object [] args)     
    {       
      if (logger.IsDebugEnabled)       
      {         
        Write(LogLevel.Debug, format, args);       
      }     
    }      

    private void Write(LogLevel level, string format, params object [] args)     
    {       
      LogEventInfo le = new LogEventInfo(level, logger.Name, null, format, args);
      logger.Log(typeof(NLogLogger), le);     
    }   
  } 

Этот пример был написан специально для контекста вопроса, который касался упаковки NLog для использования с NInject.

Перейдите по ссылке, чтобы получить более подробное объяснение того, почему это работает и почему не работают более наивные подходы.

Также, смотрите эту ссылку для примеров (от разработчика NLog) того, как обернуть NLog:

https://github.com/jkowalski/NLog/tree/master/examples/ExtendingLoggers

Наконец, рассмотрите возможность использования Common.Logging для .NET в качестве абстракции ведения журнала или в качестве примера написания абстракции ведения журнала.

...