如何配置 slf4j(用于 JDA)与 log4j(用于 Minecraft Paper)一起工作?

How to configure slf4j (for JDA) to work with log4j (for Minecraft Paper)?

我正在为 Minecraft 制作插件 - 'Paper' exactly. And it uses JDA 用于 Discord 机器人功能。

问题是,Minecraft(Paper) 使用 log4j 作为其日志记录库。 JDA 使用 slf4j 作为其日志记录库。我希望 JDA 使用 log4j,以便 JDA 的错误消息将作为插件的错误消息显示在控制台中。 (实际日志见 EDIT2)

System.out.println() 因为 Minecraft(Paper) 会抱怨使用它。
没有 Logback,因为我认为它是另一个日志库,因此它不能很好地与 Minecraft(Paper) 的日志系统一起工作(Minecraft 日志中没有 JDA 日志等)。当Minecraft已经提供日志系统log4j时,我不想实现另一个日志库。

JDA wiki 只描述了 Logback,所以我必须找到自己的方法来使用 Minecraft 的日志系统制作 JDA,但没有成功。

例如:

// Something went wrong in JDA and shows stacktrace
[05:20:26] [Server thread/ERROR]: [MyPlugin] [JDA] 'JDA Error Message'
(prints stacktrace of the error)

// Show debug message of WebSocketClient (Since it is debug message, this can be turned off)
[05:20:26] [Server thread/DEBUG]: [MyPlugin] [JDA] WebSocketClient - Connected to WebSocket

// Show JDA message when JDA bot is loaded
[05:20:26] [Server thread/DEBUG]: [MyPlugin] [JDA] JDA - Finished Loading!

这些消息应该是 Minecraft(Paper) 日志系统的一部分,而不是模仿它。这意味着,它应该在代码的某处使用 JavaPlugin#getLogger().info() 或类似的东西。

如何让JDA变成这样?
仅仅实施 log4j-slf4j18-impl 是行不通的。我想我应该对 JDA 的日志记录做些事情。


编辑:这是当前的 build.gradle 文件内容。 LINK

目前,我的插件为 JDA 实现 log4j-slf4j-impl

Log4j 2 SLF4J Binding 就是为了这个目的而存在的。 它是一个 SLF4J 记录器实现(如 slf4j-simple),可将所有内容记录到 log4j。换句话说,使用 SLF4J 记录的所有内容都将转发到 log4j。

为了使用它,只需将以下内容添加到您的 pom.xml(参见 this):

<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-slf4j18-impl</artifactId>
  <version>2.17.2</version>
</dependency>

如果你使用Gradle,它看起来像这样:

compile 'org.apache.logging.log4j:log4j-slf4j18-impl:2.17.2'

添加此依赖项包括并自动注册记录器。

您需要添加一个从 slf4jlog4j 的“桥梁”。 适当的依赖关系需要适合 slf4j 版本和 log4j 版本。

为了找到正确的版本,我检查了 the build.gradle.kts of JDA JDA 使用 1.7.25 版本的 slf4j 而您的模块使用 2.17.2 版本的 log4j.

所以你需要加上log4j-slf4j-impl.
The log4j-slf4j18-impl is for sl4j from 18 and newer version.

Maven 版本

<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-slf4j-impl</artifactId>
  <version>2.17.2</version>
</dependency>

Gradle版本

compile 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.2'

此外,假设您的构建依赖于 JDA,完全省略导入 SL4J 可能会有所帮助,因为依赖 JDA 将使 SL4J 可用于您的插件。 JDA 对 SLF4J 的依赖被声明为 API,因此可用。

这也是源自the build.gradle.kts of JDA

所以您很可能可以安全地从依赖项中删除 org.slf4j:slf4j-api:1.8.0-beta4

更新:针对 gradle.build 文件。

  • Shadowjar-ing/shading sl4j 和 log4j 可能会干扰初始化过程。我可以找到 an occurrence to support this。您可以删除所有相关的重定位并重试。
  • compileOnly('org.slf4j:slf4j-api:1.7.36')替换为compileOnly('org.slf4j:slf4j-api:1.7.25')以匹配JDA声明的版本。这很可能与所面临的错误无关。