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

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


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


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

另外,还有一个问题-关于Log4J2 architecture page


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


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

最佳答案

为什么不使用<LoggerConfig>代替<Logger>


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


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


我相信您问题的答案在于记录器的层次结构。您可以有多个共享相同LoggerLogger实例。考虑以下情况,其中您定义了一个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中也对此进行了说明。

关于java - 了解Log4J2中Logger和LoggerConfig之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56093098/

10-09 00:41