我已在我的应用中集成了log4net。我有一些辅助方法来帮助记录调用log4net。在重构时,我计划将这些方法移动到基类,以便代码不会在其他派生类中重复。
没有继承模型,以下在每个类中都能正常工作
private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
将上述内容放在基类中将返回声明类型作为基类而不是派生类。
将此声明移动到基类的最佳方法是什么?
目前,我可以想出几种方法来实现这一目标,但却找不到最佳方法。
答案 0 :(得分:11)
我想我会这样做:
LogManager.GetLogger(this.GetType());
答案 1 :(得分:3)
根据Sefan的回答,这是我在基类中声明的方式
/// <summary>
/// This is delay loaded to allow us to capture the class type of the inherited class on request
/// </summary>
private ILog log = null;
protected ILog Log
{
get
{
if (log == null)
{
log = LogManager.GetLogger(this.GetType());
}
return log;
}
}
答案 2 :(得分:0)
我们只是在每个需要记录器的类中重新声明它(它是私有静态的)并使用代码片段来简化如下键入log<tab><tab>
虽然你可以做类似的事情,但是想得到额外的幻想:
public class Loggable<T> where T : Loggable<T>
{
private static readonly ILog log = LogManager.GetLogger(typeof(T));
protected static ILog Log
{
get
{
return log;
}
}
}
并在您的继承层次结构中打入T,以便它是派生程度最高的类。 这里所有答案的问题在于您丢失了有关日志消息来源的信息,因此尽管添加了样板,我仍会亲自坚持原始代码。