在 CentOS 上,Java 应用日志切割常见有几种方式,下面按最常用 → 进阶给你讲清楚,你可以按需选。
适合:所有 Java 日志(不管你用 log4j / logback / 系统输出)
假设 Java 日志在:
/opt/app/logs/app.log
vi /etc/logrotate.d/app-log
内容示例:
/opt/app/logs/app.log {
daily
rotate 30
missingok
notifempty
compress
delaycompress
copytruncate
}
daily:每天切割rotate 30:保留 30 份compress:压缩旧日志copytruncate:不重启 Java 进程直接截断日志(很重要)logrotate -d /etc/logrotate.d/app-log # 模拟
logrotate -f /etc/logrotate.d/app-log # 强制执行
✅ 优点:简单、稳定、不用改代码
❌ 缺点:不是“按大小”实时切
<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>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
✅ 按天切
✅ 自动删旧
✅ 不依赖系统
<RollingFile name="File" fileName="/opt/app/logs/app.log"
filePattern="/opt/app/logs/app-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d %p %c{1.} - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100MB"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingFile>
✅ 按大小 + 时间
✅ 自动压缩
如果你用 Spring Boot:
logging:
file:
name: /opt/app/logs/app.log
logback:
rollingpolicy:
file-name-pattern: /opt/app/logs/app.%d{yyyy-MM-dd}.log
max-history: 30
❌ 手动 rm app.log
❌ 直接 > 清空正在写的日志
➡ Java 还会写旧 inode,日志“消失但磁盘不释放”
| 场景 | 推荐 |
|---|---|
| 老系统 / 无日志框架 | logrotate |
| 新项目 | logback / log4j2 |
| Spring Boot | 内置配置 |
| 容器 / K8s | 输出 stdout + 外部采集 |
如果你愿意,可以告诉我:
我可以直接帮你写可用配置。