堆栈跟踪,与伐木外墙的呼叫现场问题

时间:2011-07-15 08:15:16

标签: .net logging stack-trace facade

如何记录外观(如果他们这样做)在内部解决问题,他们将额外的堆栈跟踪帧添加到日志条目的上下文或隐藏调用点。似乎在一些立面(例如simple logging facade)中,呼叫站点将始终是外观本身。

如果我要编写自己的日志外观,我有什么可能的解决方案?

1 个答案:

答案 0 :(得分:1)

有关如何为NLog编写包装器的一个示例,请参阅我对此问题的回答:

Nlog Callsite is wrong when wrapper is used

为节省时间,我在这里复制了代码:

  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 for .NET作为日志记录抽象或作为如何编写日志记录抽象的示例。