日志记录外观(如果有的话)如何在内部解决问题,即它们会将额外的堆栈跟踪帧添加到日志条目的上下文或模糊调用站点。似乎在某些门面(例如简单的日志门面)中,调用站点将始终是门面本身。
如果我要编写自己的日志记录外观,我有什么潜在的解决方案?
日志记录外观(如果有的话)如何在内部解决问题,即它们会将额外的堆栈跟踪帧添加到日志条目的上下文或模糊调用站点。似乎在某些门面(例如简单的日志门面)中,调用站点将始终是门面本身。
如果我要编写自己的日志记录外观,我有什么潜在的解决方案?
有关如何为 NLog 编写包装器的示例,请参阅我对这个问题的回答:
为了节省时间,我在这里复制了代码:
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作为日志抽象或作为如何编写日志抽象的示例。