在 CentOS 上 Java 日志过大 是常见问题,通常分为 应用日志(log4j / logback) 和 JVM 日志(gc.log、hs_err 等) 两类。下面按「原因 → 解决方式 → 实战建议」说明。
du -sh /var/log/*
du -sh /opt/app/logs/*
常见大文件:
catalina.out(Tomcat)app.log、error.loggc.loghs_err_pid*.log<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app-%d{yyyy-MM-dd}-%i.log">
<SizeBasedTriggeringPolicy size="100 MB"/>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
✅ 关键点:
vim /etc/logrotate.d/tomcat
/opt/tomcat/logs/catalina.out {
daily
rotate 7
missingok
notifempty
compress
copytruncate
}
测试:
logrotate -d /etc/logrotate.d/tomcat
logrotate -f /etc/logrotate.d/tomcat
修改 catalina.sh:
CATALINA_OUT="$CATALINA_BASE/logs/catalina.%Y-%m-%d.log"
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=5
-XX:GCLogFileSize=50M
-Xloggc:/opt/app/logs/gc.log
-Xlog:gc*:file=/opt/app/logs/gc.log:time,uptime,level:filecount=5,filesize=50M
hs_err_pid*.log
✅ 无法自动滚动
✅ 建议:
find / -name "hs_err_pid*.log" -mtime +30 -delete
或写定时任务清理。
# 不清空,避免进程写失败
: > app.log
# 或
truncate -s 0 app.log
⚠️ 不要直接 rm,Java 进程仍占用文件。
journalctl --disk-usage
journalctl --vacuum-size=500M
0 2 * * * find /opt/app/logs -name "*.log" -mtime +7 -delete
✅ 应用日志:必须配置滚动
✅ Tomcat:用 logrotate
✅ JVM:限制 GC 日志
✅ 不删正在写的文件
✅ 定期清理历史日志
如果你愿意,可以把 日志路径 / Java 版本 / 使用的框架(Spring / Tomcat) 发我,我可以直接给你一套 可复制的配置。