c# - 通过继承类中的声明获取当前类

标签 c# log4net

我正在使用 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,这对日志没有好处。如何让它获取使用继承的日志记录类的类的类名?

谢谢!

最佳答案

如果您从 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);
    }
}

然后在你的类(class)中你会这样调用它:

public class MyClass
{
    try
    {
        // do something
    } 
    catch(Exception ex)
    {
        LoggerHelper.WriteError("Problem doing something", ex, this.GetType());
    }
 }

关于c# - 通过继承类中的声明获取当前类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20739238/

相关文章:

c# - 如何在 LINQ to DB 模型类中添加表之间的关系

c# - 使用 Log4net 实现彩色日志

c# - 为每个单独的线程记录到单独的日志文件

c# - 在 C# 属性中替换字符串

c# - 将文件上传到 blob 存储错误 get_NetworkTimeout 没有实现

c# - GetBindingExpression 在第二次调用时返回 null

c# - 根据项目和子项目的文本查找 ListView 项目

c# - Log4Net 自定义附加程序 : How to log messages using a custom appender?

c# - 如何将 Log4Net 包装类作为单例类?

Log4Net 不工作