You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Minecraft插件的Javalin中禁用Jetty日志?

问题:Minecraft插件中使用Javalin无法禁用Jetty日志

我正在开发一款Minecraft插件,想用Javalin框架。通过JavalinLogger.enabled = false可以轻松禁用Javalin日志,但Jetty的日志关不掉,启动时总会输出以下内容:

[22:24:32 INFO]: [org.eclipse.jetty.server.Server] jetty-11.0.12; built: 2022-09-14T02:38:00.723Z; git: d5b8c29485f5f56a14be5f20c2ccce81b93c5555; jvm 17+35-LTS-2724
[22:24:32 INFO]: [org.eclipse.jetty.server.session.DefaultSessionIdManager] Session workerName=node0
[22:24:32 INFO]: [org.eclipse.jetty.server.handler.ContextHandler] Started i.j.j.@3293e900{/,null,AVAILABLE}
[22:24:32 INFO]: [org.eclipse.jetty.server.AbstractConnector] Started ServerConnector@4c57aa18{HTTP/1.1, (http/1.1)}{0.0.0.0:80}
[22:24:32 INFO]: [org.eclipse.jetty.server.Server] Started Server@34f89e1c{STARTING}[11.0.12,sto=0] @4657581ms

我的pom.xml依赖如下:

<dependency>
    <groupId>org.spigotmc</groupId>
    <artifactId>spigot-api</artifactId>
    <version>1.19.2-R0.1-SNAPSHOT</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>io.javalin</groupId>
    <artifactId>javalin</artifactId>
    <version>5.1.2</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>2.0.3</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.4.2</version>
</dependency>

我已经试过这些方法:

  • 设置各种系统属性,比如org.eclipse.jetty.LEVEL
  • 添加slf4j-simple及对应的simplelogger.properties配置文件
    • 同时试过log4j
    • 也试过logback

编辑1:
研究slf4j-simple源码后发现,Jetty根本没用到它,没有创建SimpleLogger实例。但如果完全移除SLF4J提供程序,Jetty不再输出日志,可Javalin会抛出大量找不到提供程序的警告。


编辑2:
问题复现步骤:

  1. 在IntelliJ中用“Minecraft”插件创建新项目
  2. 选择Spigot,版本1.19.2
  3. 修改两个文件:

pom.xml中添加以下依赖:

<dependency>
    <groupId>io.javalin</groupId>
    <artifactId>javalin</artifactId>
    <version>5.1.2</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>2.0.3</version>
</dependency>

主Java文件的onEnable()方法:

@Override
public void onEnable() {
    // Plugin startup logic
    System.setProperty(org.slf4j.simple.SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "OFF");

    JavalinLogger.enabled = false;

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    Thread.currentThread().setContextClassLoader(this.getClassLoader());
    Javalin app = Javalin.create();
    Thread.currentThread().setContextClassLoader(classLoader);
    app.get("/", ctx -> ctx.result("Hello World!"));
    app.start();
}

在Paper 1.19.2上运行会生成以下输出:

[02:39:47 INFO]: [Javalintest] Enabling Javalintest v1.0-SNAPSHOT
[02:39:48 INFO]: [org.eclipse.jetty.server.Server] jetty-11.0.12; built: 2022-09-14T02:38:00.723Z; git: d5b8c29485f5f56a14be5f20c2ccce81b93c5555; jvm 17+35-LTS-2724
[02:39:48 INFO]: [org.eclipse.jetty.server.session.DefaultSessionIdManager] Session workerName=node0
[02:39:48 INFO]: [org.eclipse.jetty.server.handler.ContextHandler] Started i.j.j.@2f6e3e6c{/,null,AVAILABLE}
[02:39:48 INFO]: [org.eclipse.jetty.server.AbstractConnector] Started ServerConnector@17e2d1ec{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}
[02:39:48 INFO]: [org.eclipse.jetty.server.Server] Started Server@5f91e5cc{STARTING}[11.0.12,sto=0] @14943ms
[02:39:48 INFO]: Running delayed init tasks
[02:39:48 INFO]: Done (4.288s)! For help, type "help"
[02:39:48 INFO]: Timings Reset

解决方法

方法1:直接禁用Jetty内部日志

Jetty 11支持通过系统属性指定无日志实现,在启动Javalin前添加以下代码即可完全关闭Jetty日志,同时保留SLF4J供Javalin使用:

System.setProperty("org.eclipse.jetty.util.log.class", "org.eclipse.jetty.util.log.NoLog");

修改后的onEnable()方法:

@Override
public void onEnable() {
    // 禁用Jetty日志
    System.setProperty("org.eclipse.jetty.util.log.class", "org.eclipse.jetty.util.log.NoLog");
    // 禁用Javalin日志
    JavalinLogger.enabled = false;

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    Thread.currentThread().setContextClassLoader(this.getClassLoader());
    Javalin app = Javalin.create();
    Thread.currentThread().setContextClassLoader(classLoader);
    app.get("/", ctx -> ctx.result("Hello World!"));
    app.start();
}

方法2:通过SLF4J统一控制Jetty日志

如果需要保留SLF4J的日志管理能力,先在pom.xml中添加Jetty的SLF4J适配器依赖(版本需和Javalin依赖的Jetty版本一致,这里是11.0.12):

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-slf4j-impl</artifactId>
    <version>11.0.12</version>
</dependency>

然后在simplelogger.properties配置文件中添加:

org.slf4j.simpleLogger.log.org.eclipse.jetty=OFF

这样就能单独关闭Jetty的日志输出,同时保留Javalin的SLF4J日志支持。

方法3:排除Jetty日志相关依赖(备选)

如果不需要Jetty的任何日志实现,可以在pom.xml的Javalin依赖中排除相关模块,但这种方法可能导致依赖缺失,仅作为备选:

<dependency>
    <groupId>io.javalin</groupId>
    <artifactId>javalin</artifactId>
    <version>5.1.2</version>
    <exclusions>
        <exclusion>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-util</artifactId>
        </exclusion>
    </exclusions>
</dependency>

内容的提问来源于stack exchange,提问作者Christian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:05:44