Почему log4j Logger.getLogger() необходимо передать тип класса?
Я прочитал несколько статей о том, как использовать log4j.
Большинство из них дают код ниже:
Logger logger = Logger.getLogger("com.foo.Bar");
или
Logger logger = Logger.getLogger(XXX.class);
Это приведет к инициализации объекта logger. Но мой вопрос: зачем нужно отправлять тип класса в качестве параметра? Кажется, когда я использую регистратор, мне все равно, в каком классе я его использую. Таким образом, тип класса не влияет на регистратор.
Если я объявляю регистратор статичным и общедоступным, я могу вызвать этот регистратор в другом классе. Так что же намерение автора создать его так? Будет ли тип класса связывать что-то, когда я использую регистратор? Или я могу отправить любые типы классов в функцию getLogger.
Ответы
Ответ 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, слишком сложно найти, где находятся сообщения журнала.