Java日志轮转策略在 Ubuntu 的落地实践
在 Ubuntu 上,Java 应用的日志轮转通常有三种落地方式:应用内日志框架(如 Logback、Log4j2)、系统级 logrotate、以及容器或 systemd 场景的补充措施。下面给出可直接使用的配置与运维要点,覆盖常见需求与坑点。
一、方案总览与选型建议
二、应用内轮转示例
<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>
<!-- 保留30天 -->
<maxHistory>30</maxHistory>
<!-- 可选:总大小上限 -->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %m%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.gz">
<PatternLayout>
<Pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %m%n</Pattern>
</PatternLayout>
<Policies>
<!-- 每天轮转 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!-- 单文件超过100MB即轮转 -->
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- 保留30个归档 -->
<DefaultRolloverStrategy max="30"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
三、系统级 logrotate 配置
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0644 app app
sharedscripts
postrotate
# 若应用支持重新打开日志(如基于 logback/Log4j2 且具备滚动信号)
# kill -USR1 $(cat /var/run/myapp.pid 2>/dev/null) 2>/dev/null || true
# 若应用不支持热重开(如直接写 catalina.out),用 copytruncate
# copytruncate
endscript
}
/opt/tomcat/logs/catalina.out {
daily
rotate 15
compress
missingok
size 200M
dateext
copytruncate
create 0640 tomcat tomcat
}
sudo logrotate -d /etc/logrotate.d/myappsudo logrotate -vf /etc/logrotate.d/myapp四、运维与最佳实践