我正在使用log4net,并希望简化用法。现在,在我使用日志记录的每个类中(几乎都是所有类),我必须写:
public class MyClass
{
public static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
try
{
// do something
}
catch(Exception ex)
{
log.Error("Problem doing something", ex);
}
}
我真正想做的是将第一个声明放在另一个类中,我可以在任何需要记录的地方继承它:
public class MyClass : Logging
{
try
{
// do something
}
catch(Exception ex)
{
log.Error("Problem doing something", ex);
}
}
public class Logging
{
public static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
}
但是,如果我这样做,那就是问题
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType
...最终拿起了类名Logging,这对日志没有好处。如何获取它来获取使用继承的日志记录类的类的类名?
谢谢!
答案 0 :(得分:4)
如果从Logging类继承所有类,那么您将无法从任何其他类继承类并创建继承结构,因为C#不支持多继承。你真的需要使用组合而不是继承。
您可以通过创建静态助手类来简化对记录器的调用:
public static class LoggerHelper
{
public static void WriteError(string message,Exception ex, Type type)
{
var log = log4net.LogManager.GetLogger(type);
log.Error(message, ex);
}
}
然后在你的课程中你会这样称呼它:
public class MyClass
{
try
{
// do something
}
catch(Exception ex)
{
LoggerHelper.WriteError("Problem doing something", ex, this.GetType());
}
}
答案 1 :(得分:0)
所以你要让你的所有课程继承自Logging
?
继承不是代码重用,它意味着表示两个域实体之间的“是一种”关系。不要滥用它。
你需要的是作文。
public class MyClass
{
private static readonly ILog log = LogManager.GetLogger(typeof(MyClass));
}
MyClass
有记录器,不是记录器。
答案 2 :(得分:0)
像这样声明你的基类:
public abstract class Logging
{
public readonly log4net.ILog log = log4net.LogManager.GetLogger(this.GetType());
}
this.GetType()
将始终返回具体类型。