如何将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没生成,日志级别也没变化。
失败原因
- SLF4J实现冲突:Jetty 12默认依赖
org.eclipse.jetty:jetty-slf4j-impl(SLF4J的一个实现绑定),当类路径同时存在slf4j-simple和jetty-slf4j-impl时,SLF4J只会选择其中一个生效,导致slf4j-simple的配置不起作用。 - 配置文件过时:
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




