Tomcat禁用catalina.out后如何获取线程dump?
解决方案
一、控制catalina.out的日志增长
1. 让Log4j日志不再写入catalina.out
修改你的Log4j配置文件(log4j.properties或log4j2.xml),将原本输出到控制台(System.out/System.err)的日志重定向到单独的滚动日志文件,彻底切断Log4j与catalina.out的关联:
以log4j.properties为例:
# 定义滚动文件Appender log4j.appender.appLog=org.apache.log4j.RollingFileAppender log4j.appender.appLog.File=${catalina.base}/logs/application.log log4j.appender.appLog.MaxFileSize=100MB log4j.appender.appLog.MaxBackupIndex=10 log4j.appender.appLog.layout=org.apache.log4j.PatternLayout log4j.appender.appLog.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n # 根日志仅输出到文件,移除控制台Appender log4j.rootLogger=INFO, appLog
2. 配置catalina.out自动滚动(可选,无需禁用catalina.out)
如果不想完全丢弃catalina.out,可通过Tomcat自带的日志配置限制其大小并自动滚动,避免文件膨胀到GB级:
编辑Tomcat的conf/logging.properties,修改1catalina.org.apache.juli.FileHandler的参数:
handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler # 配置catalina.out的滚动规则 1catalina.org.apache.juli.FileHandler.level = FINE 1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs 1catalina.org.apache.juli.FileHandler.prefix = catalina. # 单个文件最大100MB,最多保留10个备份文件 1catalina.org.apache.juli.FileHandler.maxLength = 104857600 1catalina.org.apache.juli.FileHandler.count = 10 1catalina.org.apache.juli.FileHandler.formatter = java.util.logging.SimpleFormatter
二、解决kill -3线程dump的输出问题
方案1:保留catalina.out滚动配置(推荐)
如果采用上面的catalina.out自动滚动配置,无需设置CATALINA_OUT=/dev/null。此时执行kill -3 <PID>,线程dump会直接写入当前的catalina.out文件(或滚动后的catalina.1.log等文件),直接查看对应日志文件即可。
方案2:必须禁用catalina.out时的处理
如果一定要设置CATALINA_OUT=/dev/null,可通过修改Tomcat启动脚本,让JVM的System.out(线程dump的输出目标)单独重定向到指定文件:
编辑catalina.sh(Linux环境),找到启动Tomcat的执行语句,修改为:
# 将JVM标准输出重定向到线程dump专用文件,错误输出丢弃(或按需重定向) exec "$PRGDIR"/"$EXECUTABLE" start "$@" 1>${catalina.base}/logs/thread_dump.log 2>/dev/null
之后执行kill -3 <PID>,线程dump会自动写入${catalina.base}/logs/thread_dump.log文件。
内容的提问来源于stack exchange,提问作者sushil
相关产品推荐
相关产品推荐

