Tomcat logging.properties中CglibAopProxy日志级别设置无效问题
看起来你已经通过自定义日志格式确认了日志确实来自org.springframework.aop.framework.CglibAopProxy,但设置的ERROR级别完全没起作用,还是能看到INFO级别的输出。我来帮你梳理几个常见的排查方向和解决办法:
1. 先确认Logger的实际生效级别
首先建议你通过代码调试,直接查看这个Logger的实际运行级别,排除配置是否真的被加载:
import java.util.logging.Logger; // 在项目启动的初始化代码中添加这段调试逻辑 Logger cglibLogger = Logger.getLogger("org.springframework.aop.framework.CglibAopProxy"); System.out.println("CglibAopProxy Logger 当前级别: " + cglibLogger.getLevel()); System.out.println("父Logger 当前级别: " + cglibLogger.getParent().getLevel());
如果输出显示cglibLogger.getLevel()是null或者INFO,说明你的logging.properties配置要么没被正确加载,要么被后续的配置给覆盖了。
2. 检查Spring框架的日志配置覆盖
如果你的项目是Spring Boot项目,Spring自身的日志配置优先级会高于Tomcat的logging.properties。打开你的application.properties或application.yml,看看有没有类似这样的配置:
# 这行配置会直接覆盖你在logging.properties里的设置 logging.level.org.springframework.aop.framework.CglibAopProxy=info
把它改成error或者直接删除,就能让Tomcat的配置生效。
3. 排查日志桥接依赖的影响
如果你的项目引入了SLF4J、Logback这类日志框架,可能通过jul-to-slf4j这样的桥接组件,把Java Util Logging(Tomcat默认用的日志系统)的日志转接到SLF4J体系中。这种情况下,logging.properties的级别设置会被SLF4J的配置覆盖。
你需要检查项目的依赖文件(比如Maven的pom.xml或Gradle的build.gradle),如果有jul-to-slf4j依赖,要么移除它(如果不需要桥接),要么在SLF4J的配置文件(比如logback.xml)中设置对应的级别:
<logger name="org.springframework.aop.framework.CglibAopProxy" level="ERROR"/>
4. 确认Tomcat加载的是你修改的logging.properties
有时候你修改的可能不是Tomcat实际加载的配置文件:
- 确保你修改的是Tomcat安装目录下
conf/logging.properties,而不是项目资源目录里的同名文件 - 如果是IDE中启动Tomcat,检查IDE的Tomcat配置,确认它指向的是你修改的那个
conf目录
5. 修复logging.properties中的语法小问题
你的原配置里handlers重复了java.util.logging.ConsoleHandler,虽然这不会直接导致级别失效,但建议修正为:
handlers = java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.level = FINE java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter java.util.logging.SimpleFormatter.format=%1$tF %1$TT.%1tL [::] %4$s %3$s %5$s %n org.springframework.aop.framework.CglibAopProxy.level = ERROR
建议先从第一步的调试开始,确认Logger的实际级别,这样能快速定位是配置没加载,还是被其他配置覆盖了。
内容的提问来源于stack exchange,提问作者Vojtěch

