Logback配置日志文件超1MB限制且未归档问题咨询
问题描述
我配置了如下Logback配置:
<configuration> <property name="HOME_LOG" value="/home/mah454/logs/app.log"/> <appender name="FILE-ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${HOME_LOG}</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>/home/mah454/logs/app.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxFileSize>1MB</maxFileSize> <totalSizeCap>5MB</totalSizeCap> <maxHistory>3</maxHistory> </rollingPolicy> <encoder> <pattern>%d %p [%t] %m%n</pattern> </encoder> </appender> <logger name="com.sample" level="debug" additivity="false"> <appender-ref ref="FILE-ROLLING"/> </logger> <root level="error"> <appender-ref ref="FILE-ROLLING"/> </root> </configuration>
并编写了如下无限循环代码测试Logback的限制:
package com.sample; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MainClass { private static final Logger logger = LoggerFactory.getLogger(MainClass.class); public static void main(String[] args) { while (true) { logger.info("This is INFO"); } } }
为何logback.xml中配置的1MB文件大小限制被突破,且日志从未被归档?
问题原因及解决方案
以下是几个可能导致该问题的核心原因及对应解决办法:
1. Logback版本兼容性缺陷
SizeAndTimeBasedRollingPolicy在Logback 1.1.0之前的版本存在大小触发逻辑的bug,无法正确触发滚动归档。请确认使用的是Logback 1.1.0及以上版本,该版本修复了该策略的大小检测问题。
2. 文件系统缓存导致大小检测延迟
操作系统的文件缓存可能让Logback无法实时获取日志文件的真实大小,导致超过阈值后仍未触发滚动。可以通过强制即时刷新写入来解决:
<appender name="FILE-ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${HOME_LOG}</file> <immediateFlush>true</immediateFlush> <!-- 强制写入后立即刷盘 --> <!-- 其余配置保持不变 --> </appender>
3. 滚动触发逻辑补充配置
虽然SizeAndTimeBasedRollingPolicy自带大小检测,但在极端快的日志写入场景下,可额外配置触发策略明确大小触发条件,提升检测灵敏度:
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>/home/mah454/logs/app.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxFileSize>1MB</maxFileSize> <totalSizeCap>5MB</totalSizeCap> <maxHistory>3</maxHistory> </rollingPolicy> <!-- 补充大小触发策略 --> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>1MB</maxFileSize> </triggeringPolicy>
4. 目录权限不足
日志文件能正常写入,但归档时需要创建压缩文件,若/home/mah454/logs目录没有足够的读写权限,会导致归档失败。可通过以下命令检查权限:
ls -ld /home/mah454/logs
确保运行程序的用户对该目录拥有完整的读写权限。
内容的提问来源于stack exchange,提问作者mah454
相关产品推荐
相关产品推荐

