Jetty中特定Java类的Debug日志无法正常输出问题排查
我帮你梳理下几个关键的配置错误,这应该就是你看不到DEBUG日志的核心原因:
1. ConsoleAppender的过滤器直接拦截了DEBUG日志
看你的log4j配置里,ConsoleAppender添加了LevelMatchFilter只接受INFO级别,后面还跟着DenyAllFilter——这意味着所有非INFO级别的日志都会被直接拒绝,包括你想要的DEBUG日志。这是最直接、最致命的问题。
2. 日志版本不匹配(Log4j 1.x vs Log4j 2.x)
你启用的Jetty模块是log4j2-slf4j.mod和slf4j-log4j2.mod,这些都是Log4j 2.x相关的绑定组件,但你的配置文件却是Log4j 1.x的格式(引用org.apache.log4j包下的类,用log4j.dtd约束)。两者的配置结构、API完全不同,Jetty加载的Log4j 2.x根本不会识别这个1.x的配置文件。
3. Jetty日志模块冲突
你同时启用了log4j2-slf4j.mod和slf4j-log4j2.mod,这两个是互斥的绑定器:
slf4j-log4j2是让SLF4J API用Log4j 2.x作为底层日志实现log4j2-slf4j是让Log4j 2.x的API转接到SLF4J
同时启用会导致日志链路混乱,必须二选一。
修复步骤
第一步:清理Jetty冲突模块
先移除互斥的模块,保留正确的绑定关系:
java -jar start.jar --remove-from-start=log4j2-slf4j.mod
确保最终启用的日志模块为:slf4j-api.mod, logging-slf4j.mod, slf4j-log4j2.mod
第二步:替换为Log4j 2.x格式的配置文件
删除旧的log4j.xml,创建log4j2.xml(Log4j 2.x的标准配置文件名),内容如下(适配你的需求):
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <!-- 控制台输出Appender --> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%-5p %c{1} - %m%n"/> </Console> </Appenders> <Loggers> <!-- 配置Hikari的DEBUG日志 --> <Logger name="com.zaxxer.hikari" level="DEBUG" additivity="false"> <AppenderRef ref="Console"/> </Logger> <!-- 根日志级别 --> <Root level="ERROR"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
注意:这里去掉了原来的过滤器,这样DEBUG日志就能正常输出到控制台了。如果需要过滤特定级别,可以用Log4j 2.x的ThresholdFilter或者LevelFilter,不要用1.x的老过滤器类。
第三步:验证配置位置
确保log4j2.xml放在以下位置之一:
- 项目的
src/main/resources目录(打包后会在WAR的WEB-INF/classes下) - Jetty的
resources目录(全局配置)
第四步:重启Jetty服务
重新启动Jetty,现在应该能看到com.zaxxer.hikari包下的DEBUG日志输出了。
额外提醒:如果你的Spring MVC项目自己引入了Log4j相关依赖,要确保和Jetty使用的版本一致,避免依赖冲突。比如如果用Log4j 2.x,项目里的依赖应该是log4j-core、log4j-api和slf4j-log4j2,不要混合引入Log4j 1.x的包。
内容的提问来源于stack exchange,提问作者We are Borg

