Понимание разницы между Logger и LoggerConfig в Log4J2 - PullRequest
0 голосов
/ 11 мая 2019

Я читал руководство по Log4J2 и у меня были некоторые уточняющие вопросы о Logger vs LoggerConfig.

В файле log4j2.xml почему элементы <Logger> относятся к конфигурациям LoggerConfig, а не к конфигурациям Logger? В частности, на странице конфигурации Log4J2 упоминается

LoggerConfig настраивается с использованием элемента <Logger>. Элемент logger должен иметь указанный атрибут name, обычно будет иметь указанный атрибут level, а также может иметь указанный атрибут addidity.

Это, однако, кажется особенно запутанным, учитывая, что в архитектуре программного обеспечения существуют классы Logger и LoggerConfig. Почему тогда не используется <LoggerConfig> вместо <Logger>?

Также еще один вопрос - на странице архитектуры Log4J2 , упоминается

Logger, который напрямую связан с корневым LoggerConfig, может быть получен следующим образом: Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);

но в соответствии со схемой UML в верхней части страницы существует связь 1 со многими между LoggerConfig и Logger. Таким образом, как вы можете получить один Logger, указав имя корневого LoggerConfig?

1 Ответ

0 голосов
/ 12 мая 2019

Почему тогда не используется <LoggerConfig> вместо <Logger>?

Я согласен, что наименование сбивает с толку, и я точно не знаю, почему вместо LoggerConfig было использовано Logger. Я предполагаю, что это было сделано для упрощения конфигурационного файла, поскольку вы никогда не настроите объект Logger (LogManager сделает это за вас), нет необходимости различать Logger и LoggerConfig в самом файле конфигурации, чтобы он был сокращен до Logger.

как вы можете получить один Logger, указав корневой LoggerConfig имя

Я полагаю, что ответ на ваш вопрос заключается в иерархической природе регистраторов. Вы можете иметь несколько 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. Это также показано в примерах 3 и 4 на странице архитектуры log4j2 .

...