在 CentOS 上,Java 应用日志的“滚动切割”通常有两种主流做法:
下面分别说明。
示例 logback-spring.xml:
<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</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
✅ 按天切割
✅ 保留 7 天
也可按大小切割:
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>/var/log/myapp/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<RollingFile name="RollingFile"
fileName="/var/log/myapp/app.log"
filePattern="/var/log/myapp/app-%d{yyyy-MM-dd}-%i.log">
<PatternLayout pattern="%d %p %c{1.} %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
适合:
/etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
| 参数 | 作用 |
|---|---|
| daily | 每天切割 |
| rotate 7 | 保留 7 份 |
| compress | gzip 压缩 |
| copytruncate | 不重启 Java 进程 |
| missingok | 文件不存在不报错 |
⚠️ 重要:Java 写文件必须用 copytruncate,否则会一直写旧文件。
✅ 最佳实践:
nohup > app.log &例如:
java -jar app.jar
日志由 Logback 管理。
❌ Java 进程不释放文件句柄
✅ 用 copytruncate 或框架自带滚动
❌ 日志权限问题
✅ 日志目录给运行用户权限
❌ 磁盘写满
✅ 设置 maxHistory / rotate
| 场景 | 推荐方式 |
|---|---|
| Spring Boot | Logback |
| 老系统 | Log4j |
| 运维统一管控 | logrotate |
| 容器 | 输出到 stdout |
如果你愿意,可以告诉我:
我可以给你一份可直接用的配置。