Java日志在CentOS上的轮转机制
一、机制总览
二、方式对比
| 方式 | 触发与执行 | 典型配置要点 | 适用场景 | 优点 | 注意点 |
|---|---|---|---|---|---|
| 应用内轮转(Logback/Log4j2) | 应用内定时/定量触发 | Logback:TimeBasedRollingPolicy、SizeAndTimeBasedRollingPolicy;Log4j2:RollingFile + TimeBasedTriggeringPolicy/SizeBasedTriggeringPolicy | 可修改应用配置、对滚动细粒度可控 | 精确控制、与应用逻辑解耦小 | 需重启或支持热加载配置;与系统轮转可能叠加 |
| 系统级轮转(logrotate) | 由系统定时任务触发 | /etc/logrotate.d/ 配置 daily/rotate/compress/create/postrotate | 无法改应用或需统一治理 | 运维统一、与系统工具链集成 | 需确保应用能重新打开日志文件(如 HUP/信号) |
| 容器/编排 | 容器运行时或编排平台管理 | Kubernetes json-file 日志驱动、容器 stdout/stderr | 容器化部署 | 与平台集成、便于集中采集 | 需与节点/集群日志采集方案配合 |
三、配置示例
<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</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO"><appender-ref ref="FILE"/></root>
</configuration>
<Configuration status="WARN">
<Appenders>
<RollingFile name="RollingFile" fileName="/var/log/myapp/app.log"
filePattern="/var/log/myapp/app-%d{yyyy-MM-dd}-%i.log">
<PatternLayout>
<Pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingFile>
</Appenders>
<Loggers><Root level="info"><AppenderRef ref="RollingFile"/></Root></Loggers>
</Configuration>
/var/log/myapp/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 644 root root
postrotate
# 通知应用重新打开日志文件(示例为 kill -HUP,按实际进程名/信号调整)
/usr/bin/killall -HUP java || true
endscript
}
四、运维与最佳实践