为。net编写日志抽象,或作为如何编写日志抽象的示例。
日志facade(如果它们这样做的话)如何在内部解决它们将向日志条目的上下文添加额外的堆栈跟踪帧或模糊调用站点的问题?似乎在一些facade(例如简单的日志facade)中,调用站点总是facade本身。
如果我要写自己的日志facade,我有什么可能的解决方案?
关于如何为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。