4

我在 ASP.NET MVC 网站中使用(可能滥用)log4net。我想每个班级有一个记录器(文档建议),但似乎我需要为每个班级预先配置一个记录器。

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

我正在附加到 SqlServer 并且可以看到Logger架构中命名的列。似乎应该很容易在该字段中放置我想要的任何内容,但我能找到的唯一动态记录器创建是在这里。我错过了什么吗?

4

3 回答 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;
    }
}
于 2012-10-05T03:27:04.310 回答
4

当您说每个类 1 个记录器时,您指的是用于创建日志消息的编程 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 记录器,而且还创建了一个附加程序以配合它。我不认为这是一个好的做法,因为附加程序可以在运行时在 web.config 或 app.config 中更容易地配置,并且通常不需要超过一个或两个附加程序,以及所有记录器输出去附加器。

于 2012-10-05T13:07:05.750 回答
1

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

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

于 2012-10-05T02:06:24.647 回答