You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何将Jetty 12嵌入式服务器日志全部定向至文件而非stderr?

Jetty 12嵌入式服务器日志全量定向至文件(禁止输出到stderr)

问题背景

我有一个可正常运行的Jetty 12嵌入式服务器,需要把所有日志都输出到logs/jetty.log文件,完全禁止输出到stderr(控制台要留作交互菜单使用)。

最初尝试了以下配置,但没生效:

  • pom.xml中添加slf4j-simple依赖
  • 创建src/main/resources/jetty-logging.properties配置日志级别和输出文件
    结果日志还是打在控制台,logs/jetty.log没生成,日志级别也没变化。

失败原因

  1. SLF4J实现冲突:Jetty 12默认依赖org.eclipse.jetty:jetty-slf4j-impl(SLF4J的一个实现绑定),当类路径同时存在slf4j-simplejetty-slf4j-impl时,SLF4J只会选择其中一个生效,导致slf4j-simple的配置不起作用。
  2. 配置文件过时jetty-logging.properties是Jetty旧版本的配置方式,Jetty 12已经全面切换到SLF4J体系,该配置文件不再被识别。

成功解决方案(使用Logback)

1. 添加Logback依赖

pom.xml中引入logback-classic,建议同时排除Jetty自带的SLF4J实现,彻底避免冲突:

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.5.16</version>
</dependency>

<!-- 可选但推荐:排除Jetty自带的slf4j实现 -->
<dependency>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-server</artifactId>
  <version>你的Jetty版本号</version>
  <exclusions>
    <exclusion>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-slf4j-impl</artifactId>
    </exclusion>
  </exclusions>
</dependency>

2. 配置Logback输出到文件

src/main/resources下创建logback.xml,指定日志输出到文件,且不输出到控制台:

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>logs/jetty.log</file>
    <append>true</append> <!-- 开启日志追加模式 -->
    <encoder>
      <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
    </encoder>
  </appender>

  <root level="info">
    <appender-ref ref="FILE" /> <!-- 只关联文件输出Appender,不配置控制台Appender -->
  </root>
</configuration>

请求日志的处理说明

默认情况下,Jetty的请求日志(由org.eclipse.jetty.server.RequestLog输出)会被上述配置捕获到logs/jetty.log中。如果需要单独拆分请求日志,可以在logback.xml中添加以下配置:

<!-- 单独的请求日志输出Appender -->
<appender name="REQUEST_LOG" class="ch.qos.logback.core.FileAppender">
  <file>logs/jetty-requests.log</file>
  <append>true</append>
  <encoder>
    <pattern>%date %msg%n</pattern> <!-- 简化请求日志格式 -->
  </encoder>
</appender>

<!-- 为请求日志单独配置Logger -->
<logger name="org.eclipse.jetty.server.RequestLog" level="info" additivity="false">
  <appender-ref ref="REQUEST_LOG" />
</logger>

这样请求日志会单独写入logs/jetty-requests.log,其他Jetty核心日志仍保留在主日志文件中。

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

火山引擎 最新活动