在 java 日志记录中,要实现日志文件按时间滚动,最标准的做法是使用 logback 框架并配置 timebasedrollingpolicy。你需要在 logback.xml 中定义一个 appender,指定 filenamepattern 来包含日期占位符(如 %d{yyyy-mm-dd}),这样当日志文件达到设定的时间周期(如每天)时,logback 会自动将当前文件重命名并创建新文件。如果还需要控制保留天数或文件大小,可以结合 maxhistory 或 triggeringpolicy 进行细化设置。

如何配置每日滚动的日志文件路径
要配置每日滚动的日志文件,核心在于 fileNamePattern 属性的设置。该属性不仅定义了日志文件的存储位置,还通过其中的日期模式决定了滚动的频率。例如,使用 %d{yyyy-MM-dd} 表示每天生成一个新文件。当系统时间跨越午夜时,当前的 appender 会关闭旧文件,并根据模式生成新的文件名继续写入。这种配置方式简单直接,适用于大多数需要按天归档日志的场景。

<?xml version="1.0" encoding="UTF-8"?><configuration><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/app.log</file><rollingpolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><filenamepattern>logs/app.%d{yyyy-MM-dd}.log</filenamepattern><maxhistory>30</maxhistory></rollingpolicy><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="INFO"><appender-ref ref="FILE"></appender-ref></root></configuration>
如何同时按大小和时间进行滚动
如果希望日志文件既受时间限制又受大小限制,可以使用 SizeAndTimeBasedRollingPolicy。这种策略允许你在每天滚动的基础上,进一步限制单个日志文件的最大大小。当文件达到设定大小时,即使未到午夜也会触发滚动,生成带序号的新文件(如 app.1.log, app.2.log)。这对于防止单日内产生过大日志文件非常有用,能更精细地管理磁盘空间。

<?xml version="1.0" encoding="UTF-8"?><configuration><appender name="SIZE_TIME_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/size_time_app.log</file><rollingpolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><filenamepattern>logs/size_time_app.%d{yyyy-MM-dd}.%i.log</filenamepattern><maxfilesize>10MB</maxfilesize><maxhistory>7</maxhistory><totalsizecap>1GB</totalsizecap></rollingpolicy><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="DEBUG"><appender-ref ref="SIZE_TIME_FILE"></appender-ref></root></configuration>
当maxHistory设置为0时会发生什么
在 TimeBasedRollingPolicy 或 SizeAndTimeBasedRollingPolicy 中,maxHistory 参数用于控制保留的日志文件历史数量。如果将其设置为 0 或未显式设置(取决于具体版本默认行为,通常建议显式设置),Logback 不会自动删除任何旧的滚动日志文件。这意味着随着时间推移,日志目录下的文件会无限累积,直到填满磁盘。因此,在生产环境中,务必根据磁盘容量和业务需求设置合理的 maxHistory 值,或者配合 totalSizeCap 使用,以防止磁盘空间耗尽。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











