jetty-logging.properties配置未对servlet生效,第三方包仍输出DEBUG日志
排查方向
确认Slf4j绑定情况
Jetty日志初始化逻辑会优先检测类路径下的Slf4j实现,只要存在slf4j-api的绑定包(比如logback-classic、slf4j-simple、slf4j-jdk14等),就会自动使用org.eclipse.jetty.util.log.Slf4jLog,你配置的jetty-logging.properties是StdErrLog专属的配置文件,对Slf4jLog完全不生效。
解决方案:要么排除不需要的Slf4j绑定强制用StdErrLog,要么直接使用对应Slf4j实现的配置文件管理所有日志,比如用Logback就加src/main/resources/logback.xml,在配置中指定ca.uhn.fhir.context的日志级别为INFO即可。校验Jetty Maven插件的配置优先级
jetty:run启动时,插件本身的类加载器优先级高于项目Webapp的类加载器,你放在src/main/resources下的配置文件是Webapp类加载器加载的,Jetty初始化日志的时候还未读取到该配置。可以直接在启动命令中通过系统属性指定日志配置,优先级最高,测试是否生效:mvn -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog -Dorg.eclipse.jetty.LEVEL=INFO -Dca.uhn.fhir.context.LEVEL=INFO -Djetty.http.port=8080 jetty:run也可以直接把系统属性写在pom的Jetty插件配置中,避免每次启动手动输入:
<plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.4.7.v20170914</version> <configuration> <systemProperties> <systemProperty> <name>org.eclipse.jetty.util.log.class</name> <value>org.eclipse.jetty.util.log.StdErrLog</value> </systemProperty> <systemProperty> <name>org.eclipse.jetty.LEVEL</name> <value>INFO</value> </systemProperty> <systemProperty> <name>ca.uhn.fhir.context.LEVEL</name> <value>INFO</value> </systemProperty> </systemProperties> </configuration> </plugin>排查第三方包的日志实现
你提到的输出DEBUG日志的ca.uhn.fhir包,默认使用Slf4j输出日志,不会走Jetty的StdErrLog日志体系。如果不同日志框架混用没有做桥接,配置Jetty的日志级别不会对这个第三方包生效。建议统一全局日志框架,用Slf4j作为门面,搭配Logback作为实现,所有日志都走同一套配置,避免配置不生效的问题。排查隐式日志配置文件
检查项目类路径以及依赖Jar包中是否存在隐藏的日志配置文件,比如logback-test.xml、logging.properties等,很多测试依赖会默认携带级别为DEBUG的日志配置,优先级高于你自定义的配置。如果使用Logback,可以在启动参数中加-Dlogback.debug=true,打印配置加载过程,确认是否读取到了意料之外的配置文件。
内容的提问来源于stack exchange,提问作者Mister Mister

