Ведение логов (журналов) и отладка

В Java доступно несколько библиотек для логирования. Логирование лучше записи в стандартный вывод или в стандартный поток ошибок с помощью System.out.println() по нескольким причинам:

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

Sponge использует org.slf4j.Logger, а не java.util.logging.Logger.

Получение логгера

Модуль Guice, используемый при инициализации плагинов, содержит логгер для каждого плагина. Благодаря этому можно указать аннотацию @Inject перед полем, методом или конструктором, чтобы получить логгер плагина, заранее сконфигурированный с правильным ID плагина.

Примечание

См. Основной класс плагина для получения информации о настройке ID вашего плагина.

Пример - поле

import com.google.inject.Inject;
import org.slf4j.Logger;

@Inject
private Logger logger;

Пример - метод

private Logger logger;

@Inject
private void setLogger(Logger logger) {
    this.logger = logger;
}

Пример - конструктор

// For the purpose of this example, "Banana" is the class name

private Logger logger;

@Inject
public Banana(Logger logger) {
    this.logger = logger;
}

Рекомендуется задать логгер в главном классе плагина, так как модуль Guice создаёт его экземпляр при загрузке плагина.

Также идеально, хотя не обязательно, создать метод чтения (геттер) для логгера в том же классе. Пример метода чтения показан ниже.

public Logger getLogger() {
    return logger;
}

Вывод сообщений

Выводить сообщения с помощью логгера очень просто.

Примечание

В следующем примере подразумевается, что метод получения логгера называется getLogger(), как показано в предыдущем разделе. Его можно назвать по-другому.

getLogger().info(String);
getLogger().debug(String);
getLogger().warn(String);
getLogger().error(String);

Строка - это сообщение, которое нужно вывести. Например:

getLogger().warn("This is a warning!");