您是对的,如果您希望能够轻松区分日志级别并为每个类使用不同的日志目标(“附加程序”) ,那不是最好的方法。
通常建议每个类都有一个静态ILog
实例,以它的完全限定类型命名:
namespace Animals
{
public class Dog
{
private static readonly ILog Log = LogManager.GetLogger(typeof(Dog));
}
public class Cat
{
private static readonly ILog Log = LogManager.GetLogger(typeof(Cat));
}
}
虽然与单例相比,这看起来需要更多的工作,但从长远来看,它非常方便。完成此操作后,很容易通过配置文件区分Dog
和记录级别(使用log4net语法Cat
显示的示例):
<log4net>
<!-- appender definitions ommited -->
<!-- default for all loggers in Animals namespace -->
<logger name="Animals">
<level value="WARN"/>
</logger>
<!-- ...but we need full debug for Dogs -->
<logger name="Animals.Dog">
<level value="DEBUG"/>
</logger>
<!-- ...and we want to send Cat messages over e-mail -->
<logger name="Animals.Cat">
<level value="INFO"/>
<appender-ref ref="SmtpAppender"/>
</logger>
</log4net>
像 log4net 这样的日志框架也使用分层日志的概念:如果一个 logger 的名称后跟一个点是后代 logger 名称的前缀,则该 logger 被称为另一个 logger 的祖先。要使用此功能,最好避免手动命名记录器(使用硬编码string
s),而是使用类型信息来包含整个命名空间。