catalina过大的解决方案

警告

要解决 catalina.out 文件过大的问题,需要从 Spring Boot 应用日志配置Tomcat 日志管理策略 两方面进行优化。


✅ 一、调整 Spring Boot 的日志输出

Spring Boot 默认使用 spring-boot-starter-logging(通常是 Logback 或 Log4j2),如果未正确配置,可能导致大量日志输出到控制台,进而写入 catalina.out

1. 配置日志级别

application.ymlapplication.properties 中设置合理的日志级别,避免 DEBUG/INFO 级别日志过多输出。

logging:
  level:
    com.example: INFO  # 你的业务包名
    org.springframework: WARN
    org.hibernate: WARN

2. 禁止日志输出到控制台(推荐)

将日志只输出到文件,不输出到控制台可以有效减少 catalina.out 的增长。

如果使用 Logback

修改 logback-spring.xml,移除或注释掉 <console> 类型的 appender。

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
</appender>

<!-- 注释掉下面这行 -->
<!--<root level="INFO">-->
    <!--<appender-ref ref="STDOUT"/>-->
<!--</root>-->

如果使用 Log4j2

修改 log4j2-spring.xml,去掉 Console 输出。

<Loggers>
    <Root level="INFO">
        <!-- 去掉 Console 对应的 AppenderRef -->
        <AppenderRef ref="File"/>
    </Root>
</Loggers>

✅ 二、调整 Tomcat 的日志配置

1. 修改 logging.properties

位于 $CATALINA_HOME/conf/logging.properties,调整日志级别以减少输出。

# 设置全局日志级别为 WARNING
.level = WARNING

# 设置 Catalina 相关日志级别
org.apache.catalina.level = WARNING
org.apache.coyote.level = WARNING
org.apache.jasper.level = WARNING

2. 使用日志轮转工具(如 cronolog)

Tomcat 默认将所有输出写入 catalina.out,可通过 cronolog 实现按天分割日志。

修改 bin/catalina.sh(Linux):

# 找到这一行
# touch "$CATALINA_OUT"
# 替换为以下内容
exec $JAVA_HOME/bin/java $JAVA_OPTS -Djava.library.path="$JAVA_LIBRARY_PATH" -classpath "$CLASSPATH" $CATALINA_JAR >> /path/to/logs/catalina.out 2>&1 &

更推荐的方式是使用 cronolog 分割日志:

# 安装 cronolog
sudo apt install cronolog

# 修改 catalina.sh 启动命令
$JAVA_HOME/bin/java $JAVA_OPTS \
  -Djava.library.path="$JAVA_LIBRARY_PATH" \
  -classpath "$CLASSPATH" $CATALINA_JAR \
  2>&1 | /usr/sbin/cronolog "$CATALINA_BASE/logs/catalina.%Y-%m-%d.out" &

这样每天会生成一个新文件,例如:catalina.2025-04-05.out


✅ 三、其他建议

  1. 定期清理旧日志 使用定时任务删除超过一定天数的日志文件。

    find /path/to/logs -name "catalina.*.out" -mtime +7 -exec rm {} \;
    
  2. 监控磁盘空间 使用脚本或监控系统(如 Prometheus + Node Exporter)监控磁盘空间,及时预警。

  3. 使用日志聚合系统(可选) 将日志集中收集到 ELK(Elasticsearch + Logstash + Kibana)或 Loki 等平台,便于管理和分析。


✅ 总结

问题点解决方案
Spring Boot 输出日志过多配置日志级别、禁用控制台输出
Tomcat 日志未轮转使用 cronolog 按天分割日志
日志级别过高logging.properties 中调高日志输出级别
缺乏日志清理机制添加定时任务清理历史日志