Что такое «регистратор» в Java? - PullRequest
9 голосов
/ 09 марта 2010

У меня есть класс, в котором я вижу следующие вещи:

this.logger.severe("");
this.logger.warning("");
this.logger.info("");

Я не понимаю нескольких вещей:

  1. Как мы можем использовать метод, который не был определен ранее? Я имею в виду, что в классе не определены методы "logger". Я думал, что эти методы могут быть определены, потому что рассматриваемый класс является расширением другого класса, в котором определен «регистратор». Но в определении класса нет выражения "extends" (только "Implements").

  2. Я могу понять такие вещи: "objectName.methodName". Но что это за "имя объекта.something1.something2"? "thing1.something2 "- это имя метода? Могут ли имена методов содержать точки?

  3. Что именно делают эти "регистраторы. *"? Я думаю, что они сохраняют информацию о выполнении кода. Они вроде пишут отчет о том, что произошло во время казни. Но где я могу найти эту информацию?

ДОБАВЛЕНО:

В начале файла у меня есть: import java.util.logging.Logger;
И тогда в классе у меня есть: private Logger logger = Logger.getLogger("a.b.c.d");
Итак, logger - это объект класса Logger (но я не понимаю, почему они не могли создать экземпляр класса обычным способом с помощью «new Logger ()). Я также не понимаю, что именно делает logger.severe (» ») .

Ответы [ 5 ]

13 голосов
/ 09 марта 2010

Регистратор не делает ничего особенного. Это всего лишь код Java.

public class SomeClass {
    private Logger logger = LogFactory.getLogger(SomeClass.class);

    public void doSomething() {
        this.logger.debug("foo");
    }
}

this.logger просто указывает на переменную экземпляра с именем logger текущего экземпляра (this). Префикс this., кстати, излишний в этом примере. Можно также просто сделать logger.debug("foo") здесь.

Если он не объявлен в самом SomeClass, то, скорее всего, он был объявлен в расширяющем классе. Проверьте класс, который объявлен в extends.

Что касается вашего objectName.something1.something2 сомнения, вы уже смотрели, как работает System.out.println()? System.out возвращает объект PrintStream, который, в свою очередь, имеет метод println(). Таким образом, если objectName.something возвращает полноценные Object с методами, то вы можете просто продолжить цепочку вызовов методов.

В основном,

objectName.something1.something2;

можно перевести как

SomeObject someObject = objectName.something1;
someObject.something2;

Но если вам не нужно someObject где-либо еще в коде, то его можно просто сократить, как в вашем примере.

Обновление : согласно вашему обновлению:

Итак, logger является объектом класса Logger (но я не понимаю, почему они не могли создать экземпляр класса обычным способом, используя «new Logger ()). Я также не понимаю, что именно logger.severe (» ") до.

Просто прочитайте javadoc рассматриваемого класса, что все это делает . Что касается того, почему его нельзя создать, это из-за фабричного шаблона .

Обновление 2 : в соответствии с другой путаницей:

Я не понимаю, почему они используют это. Я имею в виду, если я использую только имя поля, не будет ли оно по умолчанию полем этого объекта? Есть ли разница между "this.x" и "x"?

Таким образом, вы можете более четко указать, к какому из них вы хотите получить доступ. Если метод содержит, например, аргумент или локальную переменную с именем logger, то this.logger все равно будет ссылаться на переменную экземпляра.

public class SomeClass {
    private Logger logger = LogFactory.getLogger(SomeClass.class);

    public void doSomething(Logger logger) {
        this.logger.debug("foo"); // Refers to the instance variable.
        logger.debug("foo"); // Refers to the method argument.
    }

    public void doSomethingElse() {
        Logger logger = LogFactory.getLogger(SomeClass.class);
        this.logger.debug("foo"); // Refers to the instance variable.
        logger.debug("foo"); // Refers to the method local variable.
    }
}
3 голосов
/ 09 марта 2010
  1. Регистратор обычно ссылается на использование класса в log4j .
  2. Регистратор - это объект-член, функция которого, например, сурово называется.
  3. Регистратор обычно входит в файл (это можно настроить через log4j.xml или другой файл конфигурации или во время запуска программы)

Редактировать: Изменена ссылка log4j.

3 голосов
/ 09 марта 2010
  1. «Регистратор» будет другим объектом, а не методом. Этот класс логгера будет иметь определенные методы, такие как public void severe(String message)

  2. 'thing1 'будет объектом, содержащимся в' objectName '. Например, Car.Engine.Cylinder.Fire(), считается плохой практикой использовать метод для запуска цилиндров автомобиля, подобный этому, и вы должны сделать что-то более похожее на Car.StartEngine() (подробнее см. закон деметры )

  3. Регистратор будет хранить записи о том, что произошло в вашей программе, поэтому, если позже произойдет сбой или ошибка, вы сможете увидеть, что произошло. Записано ли это в текстовый файл или в базу данных где-либо, зависит от реализации вашего регистратора.

1 голос
/ 08 декабря 2015

Класс java.util.Logger является основной точкой доступа к API ведения журнала Java. Вот как вы создаете регистратор:

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

Строка, передаваемая в качестве параметра фабричному методу getLogger (), представляет собой имя создаваемого регистратора. Вы можете свободно выбирать имя, но имя подразумевает, где находится Logger в иерархии Logger. Каждый. (точка) в имени интерпретируется как ветвь в иерархии.

1 голос
/ 09 марта 2010

logger - это не метод, а переменная класса, которая, по-видимому, является объектом, который предоставляет методы «серьезный», «предупреждение» и «информация».

Проверьте ваш класс на наличие чего-то вроде "someClass logger = new someClass ();"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...