java中实现按天和文件大小滚动日志,核心是使用logback的sizeandtimebasedrollingpolicy或log4j2的timebased+sizebased触发策略组合,需配置文件命名含%d与%i、设置maxfilesize、maxhistory及totalsizecap或delete清理规则。

Java 中按天和文件大小滚动输出日志,核心是使用 Logback(推荐)或 Log4j2 的滚动策略(RollingPolicy),不能只靠简单的 FileAppender。关键在于组合时间滚动(TimeBasedRollingPolicy)和大小触发滚动(SizeAndTimeBasedRollingPolicy),并合理配置文件命名与保留策略。
Logback:用 SizeAndTimeBasedRollingPolicy 实现双条件滚动
这是最常用、最稳妥的方式,支持“每天生成新文件 + 单个文件超限就切分”。需在 logback.xml 中配置:
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/app.log</file><rollingpolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><filenamepattern>logs/app.%d{yyyy-MM-dd}.%i.log</filenamepattern><maxfilesize>100MB</maxfilesize><maxhistory>30</maxhistory><totalsizecap>3GB</totalsizecap></rollingpolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender>说明:
-
%d{yyyy-MM-dd}表示按天归档;%i是同一日内因大小触发的序号(如app.2024-06-15.0.log、app.2024-06-15.1.log) -
<maxfilesize></maxfilesize>控制单个文件最大体积(默认单位是字节,支持 KB/MB/GB,如100MB) -
<maxhistory></maxhistory>保留最近多少天的历史日志(自动删除过期目录/文件) -
<totalsizecap></totalsizecap>所有归档日志总大小上限,超出时最早文件会被清理
Log4j2:用 DefaultRolloverStrategy + TimeBasedTriggeringPolicy + SizeBasedTriggeringPolicy
Log4j2 需通过组合触发策略实现“时间 + 大小”双条件。配置示例(log4j2.xml):
<rollingfile name="RollingFile" filename="logs/app.log" filepattern="logs/app.%d{yyyy-MM-dd}-%i.log"><patternlayout><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %c{1} - %msg%n</pattern></patternlayout><policies><timebasedtriggeringpolicy></timebasedtriggeringpolicy><sizebasedtriggeringpolicy size="100 MB"></sizebasedtriggeringpolicy></policies><defaultrolloverstrategy max="30"><delete basepath="logs" maxdepth="1"><iffilename glob="app.*.log"></iffilename><iflastmodified age="30d"></iflastmodified></delete></defaultrolloverstrategy></rollingfile>注意点:
- 两个
TriggeringPolicy是“或”关系:满足任一条件即触发滚动(当天内文件超 100MB 就切;没超但到了第二天零点也会切) -
filePattern中%i自动编号,避免同天多文件名冲突 -
DefaultRolloverStrategy max="30"控制归档文件总数;配合<delete></delete>可更精准清理(如按天删 + 按总大小删)
常见误区和注意事项
- 别用
TimeBasedRollingPolicy单独配大小限制——它不支持maxFileSize,仅按时间切,容易单文件过大 - Logback 的
SizeAndTimeBasedRollingPolicy要求fileNamePattern必须含%d和%i,缺一不可,否则启动报错 - 日志路径(如
logs/)需确保应用有写权限,且磁盘空间充足;建议监控totalSizeCap或Delete策略是否生效 - 开发时可设小值测试(如
maxFileSize="1MB"、maxHistory="3"),验证滚动和清理是否如期发生
不推荐的做法
手动编码判断时间/大小后重置 Logger —— 易出错、线程不安全、破坏框架生命周期管理;或用第三方脚本定时切割 —— 延迟高、可能丢日志、无法精确到行。应始终优先使用日志框架原生滚动能力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











