2015-02-25 3 views
0

Я использовал log4j в течение некоторого времени. Я никогда не понимал, почему они рекомендуют настраивать имя регистратора из класса. В частности, мне интересно: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

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

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

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

+0

Этот подход работает нормально. Я решил использовать getClass(). GetSimpleName(). – bobanahalf

0

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

2

В ответ на каждый из ваших вопросов:

  • В чем разница три заявления регистратора?

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

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

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

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

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

+0

Итак, вы говорите, что указать имя класса лучше, потому что IDE будет проверять ошибку, если String является просто строкой. – bobanahalf

2

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

В Log4j настраиваемые Loggers сопоставляются с регистраторами, которые получает ваше приложение. Так что если у вас есть классы, которые получают регистратор именованных

com.mycorp.package1.Class1 
com.mycorp.package1.Class2 
com.mycorp.package2.Class1 
com.mycorp.package2.Class2 

вы можете настроить регистратор для «com.mycorp.package1» на каком-то уровне и имеете все эти классы направляются к одному набору appenders в то время как «com.mycorp.package2 «можно установить на другой уровень ведения журнала и перенаправить в другое место.

Log4j2 все равно, что это полностью квалифицированные имена классов - все, что разделено символом '.' персонажи будут работать.

FYI - LogManager.getLogger() вернет вам регистратор, который использует имя вызывающего класса. Да, он использует отражение, но если вы объявляете Logger статическим, его нужно будет инициализировать только один раз.

Смежные вопросы