优化 Ubuntu (Linux) 下的 Tomcat 日志,主要目的是解决磁盘空间占用过大、排查问题时日志难以定位以及提高性能。
Tomcat 的日志主要分为以下几类:
以下是分步骤的优化方案:
catalina.out (最重要的一步)catalina.out 是 Tomcat 最头疼的日志文件,因为它默认会不断增长,且不会自动切割。
cronolog 或 logrotate 进行按日期切割 (推荐)这是最常用的方法。我们修改 Tomcat 的启动脚本 catalina.sh。
步骤 1: 安装 cronolog
sudo apt-get update
sudo apt-get install cronolog
步骤 2: 修改 catalina.sh
找到 Tomcat 安装目录下的 bin/catalina.sh。
搜索 touch "$CATALINA_OUT" 或者 >> "$CATALINA_OUT" 2>&1。
通常我们会将启动相关的日志输出管道重定向到 cronolog。 找到类似下面的代码行(不同版本可能略有不同):
# 旧代码
>> "$CATALINA_OUT" 2>&1 &
改为 (建议修改 catalina.sh 中的 else 分支,即 start 命令部分):
更好的做法是在 catalina.sh 中找到 org.apache.catalina.startup.Bootstrap "$@" start \ 这一行,将其修改为:
org.apache.catalina.startup.Bootstrap "$@" start 2>&1 \
| /usr/bin/cronolog "$CATALINA_BASE"/logs/catalina.%Y-%m-%d.out >> /dev/null &
注意:如果是 Tomcat 9,有时直接在 catalina.sh 改比较复杂,另一种思路是修改 conf/logging.properties 或者直接用下面的 Logrotate 方案。
logrotate (系统级管理,更稳妥)如果不想修改 Tomcat 源码,可以用 Ubuntu 自带的 logrotate 来管理。
创建配置文件:
sudo nano /etc/logrotate.d/tomcat
填入以下内容(请根据你的实际路径修改):
/opt/tomcat/logs/catalina.out {
daily
rotate 7
missingok
dateext
compress
notifempty
copytruncate
}
daily: 每天切割。rotate 7: 保留7份备份。compress: 压缩旧日志(节省空间)。copytruncate: 复制后清空原文件(Tomcat 不需要重启)。catalina.out (临时救急)如果日志已经爆满,可以立即执行:
# 清空文件内容,但不删除文件(Tomcat 进程不会报错)
sudo truncate -s 0 /opt/tomcat/logs/catalina.out
# 或者
sudo sh -c 'echo > /opt/tomcat/logs/catalina.out'
logging.properties (JULI 日志)Tomcat 使用 java.util.logging (JULI) 来处理自身的日志。配置文件位于 conf/logging.properties。
优化建议:
FINE 或 FINER,改为 INFO 或 WARNING。.level = INFO
1catalina.org.apache.juli.AsyncFileHandler.level = INFO
2localhost.org.apache.juli.AsyncFileHandler.level = INFO
logging.properties 中设置 rotatable 和保留天数(部分版本支持,如果不支持请配合 logrotate)。访问日志 (localhost_access_log.txt) 会记录每一个 HTTP 请求,流量大时非常占空间。
文件位置: conf/server.xml
找到 AccessLogValve 配置:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
优化方案:
<!-- 注释掉这段 -->
<!-- <Valve className="org.apache.catalina.valves.AccessLogValve" ... /> -->
这是你的 Java 代码打印的日志(如 System.out 或 logger.info)。
核心原则:不要在代码里用 System.out.println,要用日志框架。
推荐配置 (Logback 示例):
如果你使用 Spring Boot 或 Logback,务必配置 logback-spring.xml 或 logback.xml,开启滚动策略 (RollingPolicy)。
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/myapp.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天切割,保存30天,总大小不超过10GB -->
<fileNamePattern>logs/myapp.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
catalina.out如果你已经使用了 Log4j 或 Logback 来管理应用日志,其实 catalina.out 里主要只剩下启动信息和异常堆栈。
你可以修改 bin/catalina.sh,将标准输出重定向到 /dev/null。
修改 catalina.sh:
找到 CATALINA_OUT 变量,将其改为 /dev/null(但这会导致启动脚本输出丢失,需谨慎)。
更推荐的做法是:确保 conf/logging.properties 中的 ConsoleHandler 被移除或级别调高,这样 Tomcat 自身就不会往控制台打印太多东西。
df -h 检查。du -sh /opt/tomcat/logs/* 查看哪个文件最大。truncate -s 0 catalina.out。logrotate 管理 catalina.out。conf/logging.properties 将级别改为 INFO。