Я уже некоторое время использую log4j. Я никогда не понимал, почему они рекомендуют настраивать имя регистратора из класса. В частности, мне интересно:

  1. В чем разница между тремя объявлениями регистратора?
  2. Что лучше и почему?
  3. Есть ли метод, позволяющий копировать и вставлять объявление журнала без необходимости вводить где-нибудь имя класса? Я бы предпочел что-то, что не использует отражение ради производительности.

Например, рассмотрим класс MyClass. Я встретил три заявления:

  • final Logger myLogger = LogManager.getLogger(MyClass.class.getName());

  • final Logger myLogger = LogManager.getLogger(MyClass.class);

  • final Logger myLogger = LogManager.getLogger("MyClass");

Я прочитал документ и вижу ссылки на первую и вторую формы на сайте log4j, но я не понимаю, в чем преимущество.

1
bobanahalf 25 Фев 2015 в 22:54

4 ответа

Лучший ответ

Если я понял пункт 3: я обычно объявляю регистратор в родительских классах следующим образом:

final Logger myLogger = LogManager.getLogger(getClass());

Поэтому производные классы получают собственное имя в журнале, вы объявляете средство ведения журнала только один раз, и вам не нужно выбирать имя в каждом классе.

1
Matteo Steccolini 25 Фев 2015 в 20:01

Насколько я понимаю, вы можете называть свой регистратор как хотите. присвоение ему имени класса - это способ обеспечить уникальность имени (если вы используете полностью определенное имя), а также что-то значимое (чтобы вы знали, на что смотрите при разборе журнала). с этой целью я бы воздержался от использования статических имен строк, чтобы у вас было на одну деталь меньше, о которой нужно беспокоиться.

0
snerd 25 Фев 2015 в 20:00

Использование имени класса в качестве имени регистратора является соглашением и на данный момент, вероятно, считается «лучшей практикой». Причина очень проста - фильтрация.

В 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 () вернет вам регистратор, который использует имя вызывающего класса. Да, он использует отражение, но если вы объявите регистратор статическим, его нужно будет инициализировать только один раз.

2
rgoers 1 Мар 2015 в 03:42

Отвечая на каждый ваш вопрос:

  • В чем разница между тремя объявлениями регистратора?

    В основном, вы используете тип class двумя из трех способов: напрямую или для получения имени. Третий способ - это произвольное имя (подверженное ошибкам), которое может совпадать со вторым способом.

  • Что лучше и почему?

    Второй способ. Это самый короткий и наименее подверженный ошибкам.

  • Есть ли метод, позволяющий копировать и вставлять объявление журнала без необходимости вводить где-нибудь имя класса? Я бы предпочел что-то, что не использует отражение ради производительности.

    Если вы используете Eclipse, вы можете использовать шаблон. См. Создание регистратора Log4J или Простой шаблон eclipse Log4J. Подобные возможности существуют и в других IDE.

3
Community 23 Май 2017 в 11:50