日志记录和调试
在 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!");
操纵日志记录
注解
这些技巧应只在非常少见的情况(例如某些库中不合理的日志输出等级)下使用。如果你使用了,请提供禁用的配置文件选项。
某些库会使用诸如使用高级别的日志等级这样的不好的惯例。在这种情况下,你有三种选择:
询问库的开发者能否调整日志输出级别。这样做能从根本上解决问题。
建议你的用户使用
log4j2.xml
来配置日志输出,并提供推荐的配置。自行配置插件的日志输出等级:
((org.apache.logging.log4j.core.Logger) LogManager.getLogger("FtpLoggingFilter")).setLevel(Level.WARN);
这将使名为
FtpLoggingFilter
的 logger 的输出等级设定为WARN
,低于此等级的日志,例如INFO
和DEBUG
都会被隐藏。警告
这个解决方案假定服务器使用 log4j2 作为日志框架,但这对于所有,甚至是未来的 SpongeAPI 实现来说并不一定成立。
如果你有任何关于日志输出的问题,你都可以在 IRC、Discord 或论坛上询问。