我正在写一个应用程序。我使用 NLog 进行日志记录。在这个应用程序中,几乎每个对象都可以写入日志。我为此定义了受保护的成员:
protected Logger logger;
protected virtual Logger Logger
{
get { return logger ?? (logger = LogManager.GetLogger(this.GetType().ToString())); }
}
在这种情况下,我需要为应用程序中的每个基类复制/粘贴此代码。或者我看到其他选项:定义应用程序特定的根对象,其中包含记录器并对其进行子类化。但从语义上讲,这听起来是错误的,因为对我来说这不是真正的“是”情况。
还有更好的选择吗?
有时我真的希望 C# 能够支持多重继承或混合......
您可以编写一个扩展方法:
public static Logger Logger(this object obj) {
return LogManager.GetLogger(obj.GetType());
}
缺点是它会慢一些,因为创建的实例没有缓存(除了 NLog 内部,这是一个实现细节),但你可以自己做:
public static Logger Logger(this object obj) {
Logger logger;
Type type = obj.GetType();
// s_loggers is static Dictionary<Type, Logger>
if (!s_loggers.TryGetValue(type, out logger)) { // not in cache
logger = LogManager.GetLogger(type);
s_loggers[type] = logger; // cache it
}
return logger;
}
你可以这样称呼它:
this.Logger.Log(...)
明显的缺点是任何对象都可以写入任何其他对象的记录器。
关于内存泄漏的评论(现已删除):
第一个实现解决了这个问题。然而,它并不比任何静态对象更容易泄漏。如果您无法访问这些对象,则会发生泄漏。作为替代方案,你可以缓存WeakReference
记录器而不是记录器本身,但我认为没有意义,因为我相信 NLog 本身已经有一些缓存。否则,NLog 总是必须为每种类型创建一个新的记录器实例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)