Подтвердить что ты не робот

Почему log4j Logger.getLogger() необходимо передать тип класса?

Я прочитал несколько статей о том, как использовать log4j. Большинство из них дают код ниже:

 Logger logger = Logger.getLogger("com.foo.Bar");

или

 Logger logger = Logger.getLogger(XXX.class);

Это приведет к инициализации объекта logger. Но мой вопрос: зачем нужно отправлять тип класса в качестве параметра? Кажется, когда я использую регистратор, мне все равно, в каком классе я его использую. Таким образом, тип класса не влияет на регистратор. Если я объявляю регистратор статичным и общедоступным, я могу вызвать этот регистратор в другом классе. Так что же намерение автора создать его так? Будет ли тип класса связывать что-то, когда я использую регистратор? Или я могу отправить любые типы классов в функцию getLogger.

4b9b3361

Ответ 1

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

  • Причина, по которой многие люди используют тип класса, я думаю:

    • Прост в использовании. Вам не нужно беспокоиться о дублировании имен журналов в сложном приложении Java EE. Если другие пользователи также используют ваше имя регистратора, у вас может быть файл журнала, включающий не только вывод вашего класса, но

    • Легко проверить класс ведения журнала, так как имя журнала будет отображаться в файле журнала. Вы можете быстро перейти к определенному классу;

    • Когда вы распространяете свой класс, люди могут захотеть перенаправить ведение журнала из вашего класса в конкретный файл или в другое место. В этом случае, если вы используете специальное имя регистратора, нам может потребоваться проверить исходный код или сделать невозможным его, если souce недоступен.

Ответ 2

Из javadoc: Logger.getLogger(Class) является сокращением для getLogger(clazz.getName()). Соглашение, используемое с log4j и другими фреймворками регистрации, - это определение статического регистратора для каждого класса. Например,

public class SomeClass {
    private static final Logger LOG = Logger.getLogger(SomeClass.class);
    ...
}

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

Ответ 3

1: вы можете использовать "имя класса" или "имя строки", когда вы определяете в log4j.properties раньше, таких как

log4j.logger.anything=INFO,anything

поэтому вы можете записать свой журнал как

 Logger logger = Logger.getLogger("anything");

2: Если вы определяете какое-то имя журнала, вы можете легко его проверить, cus они являются отдельными.

Ответ 4

XXX.class - это имя вашего регистратора, чтобы флаг последующих операторов журнала. Чтобы дать вам представление о том, к какому классу принадлежат определенные записи журнала, принадлежит/из.

Ответ 5

Логгер с именем класса не является обязательным, вы можете использовать свое собственное сообщение. Согласие использовать:

Logger logger = Logger.getLogger(XXX.class) 

и полезен для отладки. Он будет записывать, какая строка кода выполняется.

Ответ 6

Это может зависеть от конкретной библиотеки журналов, но обычно это больше, чем имя. Это означает иерархию регистратора. Когда вы настраиваете свой регистратор, вы обычно передаете и уровень журнала, и имя регистратора, например:

<logger name="org.hibernate" level="ALL"/>

Этот атрибут не просто имя, а атрибут означает иерархию. И если вместо этого вы бы написать что-то вроде:

<logger name="org" level="ALL"/>

Это повлияет не только на спящий режим, но и на все, что находится в пакете org. С другой стороны, если вы напишите что-то вроде:

<logger name="org.hibernate.validator" level="ALL"/>

это касается только пакета проверки подлинности hibernate, а не остальной части Hibernate.

Кстати, если вы не хотите указывать конкретный класс для каждой фабрики, вы можете использовать что-то вроде (Kotlin):

val logger: Logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass())

Ответ 7

Вы можете отслеживать свой журнал по типу класса.

example1:

public class Bar {
    Logger logger = Logger.getLogger("com.foo.Bar");
    ...
    logger.debug("debug message");
}

Возможно, вы можете увидеть ниже сообщение журнала.

DEBUG: **com.foo.Bar** debug message

example2:

public class Foo {
    Logger logger = Logger.getLogger("com.foo.Foo");
    ...
    logger.debug("debug message");
}

Возможно, вы можете увидеть ниже сообщение журнала.

DEBUG: **com.foo.Foo** debug message

Если у вас много сообщений класса java и logger, слишком сложно найти, где находятся сообщения журнала.