如何配置 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'
添加此依赖项包括并自动注册记录器。
您需要添加一个从 slf4j
到 log4j
的“桥梁”。
适当的依赖关系需要适合 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声明的版本。这很可能与所面临的错误无关。
我正在为 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'
添加此依赖项包括并自动注册记录器。
您需要添加一个从 slf4j
到 log4j
的“桥梁”。
适当的依赖关系需要适合 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声明的版本。这很可能与所面临的错误无关。