記錄與除錯

在 Java 中可以使用一些記錄框架。記錄比使用 System.out.println() 印出到標準輸出(stdout)或標準錯誤輸出(stderr)更好,有幾個理由:

  • 記錄訊息以來源名稱作為標籤,使得更容易找出記錄訊息來自何處。

  • 記錄訊息擁有一個能夠被簡單過濾的嚴重性等級(例如停用所有非嚴重警告)

  • 記錄器框架允許您啟用或停用某些來源的消息

Sponge 此用 org.slf4j.Logger,而非 java.util.logging.Logger

取得一個記錄器(Logger)

在插件初始化期間使用的 Guice 模組擁有插件作用域(plugin-scoped)的記錄器,這允許你使用 @Inject annotate 一個欄位、方法或建構子以取得你的插件的記錄器,而此記錄器已經被使用正確地插件 ID 預先設定了。

備註

參閱 主要插件類別 以取得關於設定你的插件 ID 的資訊。

範例 - Field

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

@Inject
private Logger logger;

範例 - Method

private Logger logger;

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

範例 - Constructor

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

private Logger logger;

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

建議你在你的插件的主要類別中設置 Logger。當插件被載入時,Guice 注入器會將其實例化。

儘管是可以的,在同一類別為你的 Logger 建立一個 Getter 方法也很理想。以下是一個 Getter 方法的範例。

public Logger getLogger() {
    return logger;
}

發送訊息

使用你的 Logger 發送訊息十分簡單。

備註

以下範例假設你的 Logger 的 Getter 方法名為 getLogger(),也就是前一章節所述。這可能會取決於你的 Getter 方法而有所不同。

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

這裡的 String 是你想要發送的訊息,例如:

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

操纵日志记录

備註

这些技巧应只在非常少见的情况(例如某些库中不合理的日志输出等级)下使用。如果你使用了,请提供禁用的配置文件选项。

某些库会使用诸如使用高级别的日志等级这样的不好的惯例。在这种情况下,你有三种选择:

  1. 询问库的开发者能否调整日志输出级别。这样做能从根本上解决问题。

  2. 建议你的用户使用 log4j2.xml配置日志输出,并提供推荐的配置。

  3. 自行配置插件的日志输出等级:

    ((org.apache.logging.log4j.core.Logger) LogManager.getLogger("FtpLoggingFilter")).setLevel(Level.WARN);
    

    这将使名为 FtpLoggingFilter 的 logger 的输出等级设定为 WARN,低于此等级的日志,例如 INFODEBUG 都会被隐藏。

    警告

    这个解决方案假定服务器使用 log4j2 作为日志框架,但这对于所有,甚至是未来的 SpongeAPI 实现来说并不一定成立。

如果你有任何关于日志输出的问题,你都可以在 IRC、Discord 或论坛上询问。