我正在阅读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
名称?
我相信您问题的答案在于记录器的层次结构。您可以有多个共享相同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
都具有相同的LoggerConfig
。 log4j2 architecture page的示例3和4中也对此进行了说明。
关于java - 了解Log4J2中Logger和LoggerConfig之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56093098/