在 CentOS 上,Java 应用的日志分割通常有三种常见做法,按使用频率从高到低说明,并给出可直接用的配置示例。
logrotate(最推荐 ✅)这是 CentOS 官方推荐、最常用、最稳定 的方式,适合 Tomcat、Spring Boot、普通 Java 程序。
假设日志文件是:
/opt/app/logs/app.log
sudo vim /etc/logrotate.d/app-log
内容如下(✅ 生产常用):
/opt/app/logs/app.log {
daily
rotate 30
missingok
notifempty
compress
delaycompress
copytruncate
dateext
dateformat -%Y%m%d
}
| 参数 | 作用 |
|---|---|
daily |
每天分割 |
rotate 30 |
保留 30 份 |
compress |
压缩旧日志 |
delaycompress |
延迟压缩(防止 Java 占用) |
copytruncate |
复制后清空(不重启 Java) |
dateext |
使用日期后缀 |
missingok |
日志不存在不报错 |
生成效果:
app.log
app.log-20260121.gz
app.log-20260120.gz
sudo logrotate -vf /etc/logrotate.d/app-log
查看日志是否被正确切割。
如果你使用的是 Spring Boot,推荐在 应用内部 做日志分割。
logback-spring.xml 示例:
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/opt/app/logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/opt/app/logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</configuration>
✅ 优点:
<RollingFile name="FileAppender"
fileName="/opt/app/logs/app.log"
filePattern="/opt/app/logs/app-%d{yyyy-MM-dd}.log.gz">
<PatternLayout pattern="%d %p %c - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingFile>
size 100M
daily
rotate 30
或:
size 500M
rotate 7
kill -9会导致日志文件句柄异常。
copytruncate否则 Java 可能继续写旧文件。
sudo chown -R appuser:appuser /opt/app/logs
| 场景 | 推荐方案 |
|---|---|
| CentOS 传统部署 | logrotate + copytruncate |
| Spring Boot | Logback / Log4j2 |
| Docker / K8s | 日志框架 + 标准输出 |
| 高并发 | 日志框架 + 异步 |
如果你愿意,可以告诉我:
我可以帮你 定制一份完全可用的配置。