了解Log4J2中Logger和LoggerConfig之间的区别

时间:2019-05-11 18:18:42

标签: java logging log4j2

我正在阅读Log4J2手册,并对Logger vs LoggerConfig有一些澄清的问题。

log4j2.xml文件中,为什么<Logger>元素引用LoggerConfig配置而不是Logger配置?具体来说,在Log4J2 configuration page上,它提到

  

使用<Logger>元素配置LoggerConfig。记录器元素必须指定了name属性,通常将指定了level属性,还可能指定了可加性。

但是,鉴于Logger和LoggerConfig类都存在于软件体系结构中,这似乎特别令人困惑。为什么不使用<LoggerConfig>而不是<Logger>

另外,还有一个问题-关于Log4J2 architecture page,它提到了

  

可以通过以下方式获得直接链接到根LoggerConfig的Logger:Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);

但是根据页面顶部的UML图,LoggerConfig和Logger之间存在一对多的关联。因此,如何通过指定根LoggerConfig名称来获得单个Logger?

1 个答案:

答案 0 :(得分:0)

  

为什么不使用<LoggerConfig>而不是<Logger>

我同意命名令人困惑,并且我不确定为什么使用Logger而不是LoggerConfig。我的猜测是,这样做是为了简化配置文件,因为您永远不会配置Logger对象(LogManager会为您完成此操作),因此无需区分{{ 1}}和Logger在配置文件本身中,因此将其缩短为LoggerConfig

  

如何通过指定根LoggerConfig获得单个Logger   名字?

我相信您的问题的答案在于记录器的层次结构。您可以有多个Logger实例共享相同的Logger。考虑以下情况,其中您定义了一个LoggerConfig(使用配置文件中的LoggerConfig元素),包名称为Logger。假设您在此包中有多个类,它们都通过com.my.package通过显式或隐式传递它们的完整类名来使Logger成为一个象素。因此,也许您有一个LogManager类和另一个名为com.my.package.Class1的类。由于您为com.my.package.Class2定义了LoggerConfig,但没有为com.my.package(或com.my.package.Class1)定义Class2,所以两个类都将获得自己的Logger实例,但是两个Logger的具有相同的LoggerConfiglog4j2 architecture page的示例3和4也对此进行了说明。