我正在阅读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?
答案 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
的具有相同的LoggerConfig
。 log4j2 architecture page的示例3和4也对此进行了说明。