Logback创建日志文件时无法解析文件名日期模式求助
解决Logback RollingFileAppender日期占位符不替换的问题
首先,问题的核心在于:RollingFileAppender的<file>属性本身不支持解析日期占位符%d——这个属性是用来指定当前活动日志文件的固定名称,日期滚动的命名逻辑完全由TimeBasedRollingPolicy负责处理归档文件。
正确配置方案
如果你希望当前活动日志文件和归档文件都带有日期,可以按照以下两种方式调整配置:
方案1:移除<file>标签,让TimeBasedRollingPolicy自动管理活动文件
这是最简洁且推荐的方式:当不指定<file>时,Logback会根据fileNamePattern自动生成当前活动日志的名称(不带压缩后缀),滚动触发时再将其归档为带压缩后缀的文件。修改后的配置如下:
<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <append>true</append> <!-- 移除原来的<file>标签,由rollingPolicy自动生成活动文件名 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 归档文件的路径+命名规则,明确指定日期格式 --> <fileNamePattern>logs/archive/error-%d{yyyy-MM-dd}.gz</fileNamePattern> <!-- 注意标签名是小写的maxHistory,原配置的MaxHistory大小写错误会导致参数失效 --> <maxHistory>30</maxHistory> <!-- 可选:让Logback自动创建不存在的父目录 --> <createParentDirs>true</createParentDirs> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <Pattern>[%date{ISO8601}] [%X{requestId}] [%logger{0}] %msg%ex%n</Pattern> </encoder> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator"> <marker>MY_MARKER</marker> </evaluator> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender>
配置后效果:
- 当前活动日志文件会是
logs/error-2019-04-19(无.gz后缀) - 当日志滚动触发时(比如每天凌晨),该文件会被移动到
logs/archive/目录并压缩为error-2019-04-19.gz - 同时自动生成新的当日活动日志文件
logs/error-2019-04-20
方案2:保留<file>但使用动态文件名(不推荐)
如果一定要通过<file>指定带日期的活动文件,需要借助自定义扩展或TurboFilter实现动态文件名解析,但这种方式复杂度高,还容易引发滚动逻辑异常,因此不推荐使用。
额外注意事项
- 原配置中的
<MaxHistory>标签大小写错误,正确标签名是<maxHistory>(全小写),否则Logback无法识别该参数,不会自动清理超过30天的旧日志。 - 确保
logs/和logs/archive/目录存在,或者添加<createParentDirs>true</createParentDirs>让Logback自动创建所需目录。
内容的提问来源于stack exchange,提问作者coolsv
相关产品推荐
相关产品推荐

