Log4Net中每种类型的动态记录器

4
我在一个ASP.NET MVC网站中使用(可能滥用)log4net。我想要每个类都有一个日志记录器(文档建议),但似乎我需要为每个类预先配置一个日志记录器。
正确吗? 我需要预定义每个日志记录器吗?
我将其附加到SqlServer并可以看到模式中命名为“Logger”的列。似乎很容易将任何我想要的内容放入该字段中,但是我能找到的唯一动态日志记录器创建是此处。 我有什么遗漏的吗?
3个回答

5

你不需要事先定义每个记录器。相反,传统的方法是使用一个标准模式来使用反射在消费类中声明log4net记录器的Type。只需将此属性放入每个类中即可开始:

private static log4net.ILog _logger;
private static log4net.ILog Logger
{
    get
    {
        if( _logger == null )
        {
            Type type = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType;
            _logger = log4net.LogManager.GetLogger( type );
        }
        return _logger;
    }
}

这个答案(以及其他答案)解释了它。让我困惑的是log4net示例中预先配置了数十个记录器的XML。更糟糕的是,我的日志没有写入,这让我认为我需要一个预配置的记录器,但我很高兴能说这是错误的。谢谢大家。 - bendytree

4
当你提到每个类使用一个记录器时,你指的是编程中使用的ILog,用于创建日志消息。这些确实需要预定义,但可以采用Metro Smurf提供的方法或者更简单的方法,如果你不关心是否定义了可能不会使用的ILog。
private static ILog logger = 
   LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

这两种方法都可以配置一个记录器。使用反射来获取当前方法的类名,然后将其用作记录器名称,因此称之为“动态”。这也可以编码为以下形式(但是每个类中的代码将不同,并且反射方法使其易于作为片段完成)。

private static ILog logger = LogManager.GetLogger(typeof(MyCurrentClass));

根据您关于“随心所欲”的评论,当您创建 ILog 实例时,您也可以非常轻松地实现这一点(请原谅双关语)。
private static ILog logger = LogManager.GetLogger("whatever I want");

您所包含的链接不仅创建了一个ILog记录器,还创建了一个附带的appender。我认为这并不是一个好的做法,因为可以更容易地在web.config或app.config中运行时配置appenders,并且通常不需要有超过一个或两个appenders,所有记录器输出都应该发送到appenders。


1
这里的“动态”方面是什么?您确实需要实例化一个记录器才能使用它,就像您必须实例化数据库连接才能使用它一样。其余部分只是命名的问题。
Log4net使得按软件组件命名记录器变得容易。这可以通过在每个类中静态实例化一个记录器来实现,其中记录器名称等于类的完全限定名称。这是一种有用且简单的定义记录器的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接