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

时间:2012-10-04 23:22:57

标签: c# asp.net-mvc log4net

我在ASP.NET MVC网站中使用(可能滥用)log4net。我希望每个类有一个记录器(which the docs suggest),但似乎我需要为每个类预先配置一个记录器。

是吗?我是否需要预定义每个记录器?

我正在附加到SqlServer&可以在架构中看到名为Logger的列。看起来在那个领域放置我想要的东西应该很容易,但我能找到的唯一动态记录器创建是here。我错过了什么吗?

3 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:4)

当你说每个类1个记录器时,你指的是程序化的ILog,它用于创建日志消息。事实上这些确实需要预定义,但它就像Metro Smurf给出的方法一样简单,如果你不关心定义可能不使用的ILog,那就更简单了:

private static ILog logger = 
   LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

这些方法中的任何一种都将配置记录器。 Reflection用于获取当前方法的类名,然后将其用作记录器名称,从而将方法称为“动态”。这也可以编码如下(但是每个类中的代码会有所不同,而反射方法可以很容易地将其作为一个片段)。

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

根据你对“放置我想要的东西”的评论,你可以在创建ILog实例时轻松做到这一点(并原谅双关语)。

private static ILog logger = LogManager.GetLogger("whatever I want");

您包含的链接不仅会创建一个ILog记录器,还会创建一个与其一起使用的追加器。我不认为这是一个很好的做法,因为在运行时可以更容易地在web.config或app.config中配置appender,并且通常不需要具有多于一个或两个appender,并具有所有记录器输出去寻找者。

答案 2 :(得分:1)

这里的“动态”方面是什么?您需要实例化记录器才能使用它,就像您必须实例化数据库连接以使用它一样。其余的只是一个命名问题。

  

Log4net可以轻松地按软件组件命名记录器。这个可以   通过静态实例化每个类中的记录器来完成,   记录器名称等于类的完全限定名称。   这是一种有用且直接的定义记录器的方法。