在 CentOS 上,Java 应用的日志滚动(Log Rotation)常见有 三种方式,按使用频率从高到低说明,并给出可直接用的配置示例。
logrotate(最常用 ✅)适合:标准 Java 应用(Spring Boot、Tomcat、普通 jar)
/var/log/myapp/app.logsudo vim /etc/logrotate.d/myapp
/var/log/myapp/app.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0644 app app
copytruncate
}
| 参数 | 作用 |
|---|---|
| daily | 按天滚动 |
| rotate 7 | 保留 7 份 |
| compress | 压缩旧日志 |
| delaycompress | 下次再压缩 |
| missingok | 日志不存在不报错 |
| notifempty | 空文件不滚动 |
| copytruncate | 复制后清空(Java 常用) |
| create | 新建日志文件权限 |
✅ copytruncate 对 Java 很重要
因为 Java 默认不会重新打开日志文件。
logrotate -d /etc/logrotate.d/myapp # 模拟执行
logrotate -f /etc/logrotate.d/myapp # 强制执行
如果你使用 Logback / Log4j2,这是最规范的方式。
logback-spring.xml 示例:
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/myapp/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/var/log/myapp/app.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</configuration>
✅ 优点:
<RollingFile name="FileAppender"
fileName="/var/log/myapp/app.log"
filePattern="/var/log/myapp/app-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout>
<Pattern>%d %p %c - %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100MB"/>
</Policies>
<DefaultRolloverStrategy max="7"/>
</RollingFile>
catalina.out 滚动Tomcat 不会自动滚动 catalina.out,推荐用 logrotate:
sudo vim /etc/logrotate.d/tomcat
/opt/tomcat/logs/catalina.out {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
copytruncatetruncate| 场景 | 建议 |
|---|---|
| Spring Boot | Logback |
| 老系统 | logrotate |
| 容器 | 日志框架 + stdout |
你可以直接告诉我:
我可以给你 完全可用的配置。