一,事由和源码
logback版本1.2.11 网上找了很多都是无法删除文件夹的,原先使用的TimeBasedRollingPolicy无法删除日志的文件夹,有很多空的日期文件夹,于是查看TimeBasedRollingPolicy源码发现有校验不删除文件夹,SizeAndTimeBasedRollingPolicy对TimeBasedRollingPolicy相对应的实现左右变动,可以删除文件夹。
1,TimeBasedRollingPolicy
TimeBasedRollingPolicy-start() ->
this.archiveRemover.cleanAsynchronously ->
TimeBasedArchiveRemover.ArhiveRemoverRunnable..capTotalSize(this.now) ->
File[] matchingFileArray = this.getFilesInPeriod(date);
2,SizeAndTimeBasedRollingPolicy
SizeAndTimeBasedArchiveRemover.getFilesInPeriod
File[] matchingFileArray = FileFilterUtil.filesInFolderMatchingStemRegex(parentDir, stemRegex);
二,更改后logback.xml 配置
yyyy-MM-dd格式日期目录,不想带-可以写成{yyyyMMdd};
<pattern>中logId参数需在before通过org.slf4j.MDC的put方法设置UUID。
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>logs/%d{yyyy-MM-dd}/info.%i.log</fileNamePattern>
<maxHistory>7</maxHistory>
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %x{logId} %-5level [%thread] %logger{0} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
日志目录如下:
logs/2024-05-28/info.0.log
logs/2024-05-29/info.0.log
logs/2024-05-29/info.1.log
logs/2024-05-30/info.1.log
三,SizeAndTimeBasedRollingPolicy参数
SizeAndTimeBasedRollingPolicy是logback日志框架中的一个参数,用于配置滚动日志文件的策略。
属性 | 类型 | 描述 |
---|---|---|
file | String | (可选)如果配置了,满足策略时,将新建一个文件,原来的文件被重命名为fileNamePattern定义的规则文件,例如:file=info.log文件大小超过maxFileSize设置20MB,历史文件为info.0.log。【建议省略该配置,防止文件占用时无法重命名】 |
fileNamePattern | String | (必须)使用%d{yyyy-MM}格式指定文件名命名规则;如果存在多个%d{},只能有一个生效,其他需要标记为%d{yyyy-MM,aux};%d{}如果省略{},%d等价于%d{yyyy-MM-dd} |
maxFileSize | String | (可选)滚动时最大文件大小 |
totalSizeCap | int | (可选)日志总容量(不是单个日志容量)上限,超限后删除最旧的日志;需要同时设置maxHistory,且优先级比maxHistory低 |
maxHistory | int | (可选)最多保留多少日志文件 |
cleanHistoryOnStart | boolean | true:表示项目启动时执行删除策略;false:表示在日志滚动中执行删除策略(默认)需要与maxHistory,totalSizeCap配合使用 |