我在ASP.NET MVC网站中使用(可能滥用)log4net。我希望每个类有一个记录器(which the docs suggest),但似乎我需要为每个类预先配置一个记录器。
是吗?我是否需要预定义每个记录器?
我正在附加到SqlServer&可以在架构中看到名为Logger
的列。看起来在那个领域放置我想要的东西应该很容易,但我能找到的唯一动态记录器创建是here。我错过了什么吗?
答案 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可以轻松地按软件组件命名记录器。这个可以 通过静态实例化每个类中的记录器来完成, 记录器名称等于类的完全限定名称。 这是一种有用且直接的定义记录器的方法。