Logback 1.1.11中totalSizeCap不生效问题排查求助
首先给你吃个定心丸:Logback 1.1.7确实有totalSizeCap配合aux日期模式时失效的bug,但1.1.11版本已经把这个问题修复了,所以基本可以排除版本bug的锅,大概率是你的配置有疏漏。我帮你梳理几个最容易踩坑的点:
1. 先确认totalSizeCap放对地方了吗?
这个参数必须直接嵌套在SizeAndTimeBasedRollingPolicy节点里,绝对不能放在RollingFileAppender或者其他节点下。举个正确的例子:
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 这里放fileNamePattern、maxFileSize这些配置 --> <totalSizeCap>5GB</totalSizeCap> <!-- 就该在这儿! --> </rollingPolicy>
要是你把它放在外面,Logback根本不会识别这个参数,自然不会生效。
2. 检查fileNamePattern的格式是否正确
你用了%d{yyyy-MM, aux}按月份归档文件夹,那fileNamePattern得和这个模式匹配才行,而且必须带上%i来区分同一时间段内超过大小限制的分割文件。比如正确的写法应该是:
<fileNamePattern>${LOG_ARCHIVE}/rollingfile.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
这里的%d{yyyy-MM-dd}是日志文件的命名粒度(按天分割),%i是用来标记同一日内超过maxFileSize的第N个文件。要是少了%i,SizeAndTimeBasedRollingPolicy根本没法准确计算总日志大小,totalSizeCap自然也不会触发清理。
3. 要不要开启cleanHistoryOnStart?
默认情况下,totalSizeCap的清理动作是在日志滚动的时候触发的。如果你的应用长时间运行没触发滚动(比如一直没写满单个日志文件),那历史日志就不会被清理。可以加个这个配置:
<cleanHistoryOnStart>true</cleanHistoryOnStart>
这样每次应用启动时,Logback都会主动检查总日志大小,超过上限就会自动删旧日志。
4. 确认日志路径变量解析正确了吗?
得确保${LOG_PATH}已经被正确解析成了实际的文件系统路径,不然Logback找不到归档文件夹,根本没法计算总大小。你可以看一下应用启动时的Logback日志,找有没有类似Setting property [LOG_PATH] to [你的实际路径]的记录,确认路径是对的。
5. 最后再确认下依赖版本
虽然1.1.11应该修复了bug,但也有可能你的依赖被其他库降级到1.1.7了(比如Maven/Gradle的依赖冲突)。你可以查一下项目的依赖树,确认实际引入的Logback版本确实是1.1.11。另外,也可以手动触发一次日志滚动(比如改一下当前日志文件的名字),然后看日志里有没有Deleting old log file [...] because total size cap [...] has been exceeded的记录,要是有就说明功能正常,只是之前没触发清理。
最后给你一个完整的参考配置,你可以对比着调整自己的配置:
<property name="LOG_PATH" value="./logs"/> <property name="LOG_ARCHIVE" value="${LOG_PATH}/%d{yyyy-MM, aux}"/> <appender name="RollingFile-Appender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/rollingfile.log</file> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_ARCHIVE}/rollingfile.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>100MB</maxFileSize> <!-- 单个日志文件的大小上限 --> <maxHistory>30</maxHistory> <!-- 保留最近30天的日志 --> <totalSizeCap>5GB</totalSizeCap> <!-- 所有归档日志的总大小上限 --> <cleanHistoryOnStart>true</cleanHistoryOnStart> </rollingPolicy> </appender>
内容的提问来源于stack exchange,提问作者franfran

