Я уже некоторое время использую log4j. Я никогда не понимал, почему они рекомендуют настраивать имя регистратора из класса. В частности, мне интересно:
- В чем разница между тремя объявлениями регистратора?
- Что лучше и почему?
- Есть ли метод, позволяющий копировать и вставлять объявление журнала без необходимости вводить где-нибудь имя класса? Я бы предпочел что-то, что не использует отражение ради производительности.
Например, рассмотрим класс MyClass
. Я встретил три заявления:
final Logger myLogger = LogManager.getLogger(MyClass.class.getName());
final Logger myLogger = LogManager.getLogger(MyClass.class);
final Logger myLogger = LogManager.getLogger("MyClass");
Я прочитал документ и вижу ссылки на первую и вторую формы на сайте log4j, но я не понимаю, в чем преимущество.
4 ответа
Если я понял пункт 3: я обычно объявляю регистратор в родительских классах следующим образом:
final Logger myLogger = LogManager.getLogger(getClass());
Поэтому производные классы получают собственное имя в журнале, вы объявляете средство ведения журнала только один раз, и вам не нужно выбирать имя в каждом классе.
Насколько я понимаю, вы можете называть свой регистратор как хотите. присвоение ему имени класса - это способ обеспечить уникальность имени (если вы используете полностью определенное имя), а также что-то значимое (чтобы вы знали, на что смотрите при разборе журнала). с этой целью я бы воздержался от использования статических имен строк, чтобы у вас было на одну деталь меньше, о которой нужно беспокоиться.
Использование имени класса в качестве имени регистратора является соглашением и на данный момент, вероятно, считается «лучшей практикой». Причина очень проста - фильтрация.
В Log4j настраиваемые вами регистраторы сопоставляются с регистраторами, получаемыми вашим приложением. Итак, если у вас есть классы, которые получают регистраторы с именем
com.mycorp.package1.Class1
com.mycorp.package1.Class2
com.mycorp.package2.Class1
com.mycorp.package2.Class2
Вы можете настроить Logger для com.mycorp.package1 на каком-то уровне и направить все эти классы к одному набору приложений, в то время как com.mycorp.package2 можно установить на другой уровень ведения журнала и направить куда-то еще.
Log4j2 на самом деле не заботится о том, чтобы это были полностью определенные имена классов - все, что было разделено знаком '.' персонажи будут работать.
FYI - LogManager.getLogger () вернет вам регистратор, который использует имя вызывающего класса. Да, он использует отражение, но если вы объявите регистратор статическим, его нужно будет инициализировать только один раз.
Отвечая на каждый ваш вопрос:
В чем разница между тремя объявлениями регистратора?
В основном, вы используете тип class двумя из трех способов: напрямую или для получения имени. Третий способ - это произвольное имя (подверженное ошибкам), которое может совпадать со вторым способом.
Что лучше и почему?
Второй способ. Это самый короткий и наименее подверженный ошибкам.
Есть ли метод, позволяющий копировать и вставлять объявление журнала без необходимости вводить где-нибудь имя класса? Я бы предпочел что-то, что не использует отражение ради производительности.
Если вы используете Eclipse, вы можете использовать шаблон. См. Создание регистратора Log4J или Простой шаблон eclipse Log4J. Подобные возможности существуют и в других IDE.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.