我在 ASP.NET MVC 网站中使用(可能滥用)log4net。我想每个班级有一个记录器(文档建议),但似乎我需要为每个班级预先配置一个记录器。
是对的吗?我需要预定义每个记录器吗?
我正在附加到 SqlServer 并且可以看到Logger
架构中命名的列。似乎应该很容易在该字段中放置我想要的任何内容,但我能找到的唯一动态记录器创建是在这里。我错过了什么吗?
您不需要预先定义每个记录器。相反,传统的方法是使用 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 个记录器时,您指的是用于创建日志消息的编程 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 中更容易地配置,并且通常不需要超过一个或两个附加程序,以及所有记录器输出去附加器。
这里的“动态”方面是什么?您确实需要实例化一个记录器才能使用它,就像您必须实例化一个数据库连接才能使用它一样。剩下的只是命名问题。
Log4net 可以通过软件组件轻松命名记录器。这可以通过在每个类中静态实例化一个记录器来实现,记录器名称等于该类的完全限定名称。这是定义记录器的一种有用且直接的方法。