LogBack升级至1.4版本后SiftingAppender无法正常工作求助
解决Logback 1.4.x中SiftingAppender初始化报错问题
我们原本使用ch.qos.logback.classic.sift.SiftingAppender配合MDC的importLogFile属性,为每个导入任务生成独立日志文件,该配置在Logback 1.2.x版本下运行正常,但升级至1.4.4版本后,Web应用启动时出现以下报错:
Appender named [FILE-importLogFile_IS_UNDEFINED] not referenced. Skipping further processing. ERROR in ch.qos.logback.classic.sift.SiftingAppender[MyImport] - AppenderFactory has not been set. Aborting
问题根源
Logback 1.3+版本对SiftingAppender的初始化逻辑做了重大变更:
- 不再自动注入默认的
AppenderFactory,必须显式配置; - 启动时会尝试根据鉴别器的默认值创建子Appender,若未被引用则触发警告,同时因为缺少AppenderFactory导致初始化失败。
解决方案
调整Logback配置,补充必要的AppenderFactory配置并优化鉴别器逻辑,修改后的完整配置如下:
<appender name="MyImport" class="ch.qos.logback.classic.sift.SiftingAppender"> <!-- 1.3+版本必须显式配置AppenderFactory,使用默认实现即可 --> <appenderFactory class="ch.qos.logback.classic.sift.DefaultAppenderFactory" /> <discriminator> <key>importLogFile</key> <defaultValue>undefined</defaultValue> <!-- 设置optional=true,当MDC中无该值时跳过处理,避免启动时创建无效Appender --> <optional>true</optional> </discriminator> <sift> <appender name="FILE-${importLogFile}" class="ch.qos.logback.core.FileAppender"> <file>${importLogFile}</file> <append>false</append> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%d %level %logger{35} - %msg%n</pattern> </layout> </appender> </sift> </appender>
关键调整说明
- 添加AppenderFactory:这是1.3+版本的强制要求,
DefaultAppenderFactory负责根据<sift>内的模板动态创建子Appender; - 鉴别器设置
optional=true:当MDC中不存在importLogFile值时,鉴别器返回null,SiftingAppender会跳过日志处理,避免启动时生成未被引用的默认Appender,解决警告问题; - 移除原EvaluatorFilter:
optional=true已经实现了无MDC值时跳过日志输出的效果,无需额外过滤逻辑。
验证
修改配置后重启应用,启动时不再出现报错;当业务代码中通过MDC.put("importLogFile", "具体日志路径")设置值后,会自动创建对应日志文件并写入日志。
内容的提问来源于stack exchange,提问作者Torgeist
相关产品推荐
相关产品推荐

