日志记录和调试

在 Java 中可以使用一些日志记录器。日志记录要优于用 System.out.println() 往标准输入输出流中打印日志,因为:

  • 记录的日志会有一个源名称标签,由此能更容易找出日志的来源。

  • 记录的日志会有一个严重级别,由此能进行简单的筛选(例如关闭所有非关键性的通知)。

  • 日志记录器允许你开启或关闭来自特定源文件的日志。

Sponge 使用 org.slf4j.Logger,而不是 java.util.logging.Logger

获取 Logger

在插件初始化期间使用的 Guice 模块允许你使用 @Inject 注解字段、方法,或者构造方法以获取插件对应的 Logger,同时这一 Logger 已经被提前配置成了你的插件 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;
}

我们建议你在你的插件主类中设置 Logger,因为这可以在你的插件主类加载时使用 Guice 实例化它。

你可以为你的插件主类添加一个 Logger 的 Getter 方法,尽管你可以不这么做。下面是一个 Getter 方法的示例。

public Logger getLogger() {
    return logger;
}

发出消息

使用你的 Logger 记录一条信息是十分简单的。

注解

下面的示例假设你的插件中获取 Logger 使用的是 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 或论坛上询问。