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


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

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

или

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

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

6 52

6 ответов:

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

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

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

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

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

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

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

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

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

log4j.logger.anything=INFO,anything

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

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

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

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

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

Logger logger = Logger.getLogger(XXX.class) 

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

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

Пример 1:

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 и регистратора, слишком сложно найти, откуда берутся сообщения журнала.