如何提升Tomcat 9.0日志详细度以排查启动延迟问题
一、细化Tomcat日志配置(突破ALL级别的局限)
你之前把logging.properties里的日志级别设为ALL但没得到足够细节,大概率是Handler级别未同步调整,或者没针对关键组件单独配置日志:
同步调整Handler的日志级别
打开C:\Program Files\Apache Software Foundation\Tomcat 9.0\conf\logging.properties,确保输出Handler的级别也设为ALL,避免记录器的日志被Handler过滤:# 确保所有Handler的级别都是ALL 1catalina.org.apache.juli.FileHandler.level = ALL java.util.logging.ConsoleHandler.level = ALL localhost.org.apache.juli.FileHandler.level = ALL manager.org.apache.juli.FileHandler.level = ALL host-manager.org.apache.juli.FileHandler.level = ALL针对Tomcat部署核心组件单独开ALL级别
添加以下配置,精准捕获部署阶段的所有细节:# Tomcat启动与部署核心日志 org.apache.catalina.level = ALL org.apache.catalina.startup.level = ALL org.apache.tomcat.util.level = ALL # 若应用用了JSP/Jasper,也加上 org.apache.jasper.level = ALL应用框架日志补充
如果你的应用基于Spring、JSF等框架,还要单独配置框架的日志级别,比如:# Spring相关日志 org.springframework.level = ALL # JSF相关日志 com.sun.faces.level = ALL
二、捕获启动时的所有SQL查询
根据你使用的持久化技术,选择对应的配置方式:
1. JDBC直连场景
在数据库连接URL中添加日志参数:
- MySQL:
jdbc:mysql://your-host/your-db?logger=com.mysql.cj.log.Slf4JLogger&profileSQL=true&logSlowQueries=true - PostgreSQL:
jdbc:postgresql://your-host/your-db?logLevel=debug&loggerLevel=debug&logSql=true
2. ORM框架场景
Hibernate
在你的application.properties或persistence.xml中添加:
# 打印SQL语句 hibernate.show_sql=true # 格式化SQL方便阅读 hibernate.format_sql=true # 显示SQL注释(关联实体、操作类型) hibernate.use_sql_comments=true # 开启Hibernate SQL参数绑定日志 org.hibernate.SQL.level = ALL org.hibernate.type.descriptor.sql.BasicBinder.level = ALL
MyBatis
在mybatis-config.xml中配置日志实现,并调整日志级别:
<settings> <!-- 使用SLF4J作为日志实现,和Tomcat日志体系兼容 --> <setting name="logImpl" value="SLF4J"/> </settings>
然后在logging.properties中添加:
org.apache.ibatis.level = ALL
3. 连接池日志
如果用了HikariCP、Druid等连接池,开启连接池的详细日志:
- HikariCP:
com.zaxxer.hikari.level = ALL - Druid:
com.alibaba.druid.level = ALL
三、额外的启动瓶颈定位手段
如果日志还是不足以找到问题,用JVM工具直接分析:
飞行记录器(JFR)
启动Tomcat时添加以下JVM参数,记录启动过程的所有细节:-XX:StartFlightRecording=filename=tomcat_startup.jfr,duration=5m -XX:FlightRecorderOptions=settings=profile启动完成后,用JDK自带的
JDK Mission Control打开tomcat_startup.jfr,可以直观看到耗时的方法调用、线程阻塞点。线程栈快照
在启动延迟的3分钟内,多次执行jstack <Tomcat进程ID>,对比不同时间点的线程状态,定位阻塞的线程(比如数据库连接等待、锁竞争)。
内容的提问来源于stack exchange,提问作者gmn_1450

