Typelevel Scala应用中logback-classic编程配置JSON日志失效排查
排查步骤与问题修正
1. SPI注册文件是否正确
- 确认
META-INF/services/ch.qos.logback.classic.spi.Configurator文件放在src/main/resources目录下,文件内容是你的LoggingConfigurator类的全限定类名(比如com.yourpackage.LoggingConfigurator),注意大小写、拼写,不能有多余空格或换行。 - 检查打包后的jar包:解压后查看
META-INF/services目录下是否存在该文件,内容是否正确。用sbt构建的话,默认src/main/resources会被包含,但自定义资源路径时要确认配置。
2. Logback Configurator实现逻辑检查
常见错误点:
- 未正确使用传入的
LoggerContext:实现configure方法时,必须用方法参数里的LoggerContext,不能自行新建实例。 - 未添加/配置JSON编码器:如果用logstash的JSON编码器,要先引入
logstash-logback-encoder依赖,然后实例化LogstashEncoder而非默认的PatternLayoutEncoder。正确示例:
import ch.qos.logback.classic.spi.Configurator import ch.qos.logback.classic.{Level, LoggerContext} import ch.qos.logback.core.ConsoleAppender import net.logstash.logback.encoder.LogstashEncoder class LoggingConfigurator extends Configurator { override def configure(context: LoggerContext): Unit = { context.reset() val consoleAppender = new ConsoleAppender[ch.qos.logback.classic.spi.ILoggingEvent]() consoleAppender.setContext(context) consoleAppender.setName("CONSOLE") val encoder = new LogstashEncoder() encoder.setContext(context) encoder.start() consoleAppender.setEncoder(encoder) consoleAppender.start() val rootLogger = context.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME) rootLogger.addAppender(consoleAppender) rootLogger.setLevel(Level.INFO) } }
- 遗漏
start()调用:Appender和Encoder必须调用start()才能生效,这是极易忽略的细节。
3. Log4cats依赖与绑定检查
- 确认引入log4cats的logback绑定依赖:build.sbt中需要包含
"org.typelevel" %% "log4cats-logback" % "<对应版本>",不能只引入log4cats-core。如果用slf4j绑定,要确保log4cats-slf4j和logback-classic都在依赖列表里。 - 检查日志实例获取方式:必须通过正确的工厂类获取,比如:
import org.typelevel.log4cats.Logger import org.typelevel.log4cats.slf4j.Slf4jLogger implicit val logger: Logger[IO] = Slf4jLogger.getLogger[IO]
如果误用了NoOpLogger等实现,会导致日志走默认配置或无输出。
4. 依赖冲突排查
- 用
sbt dependencyTree查看依赖树,检查是否有其他SLF4J绑定(比如slf4j-simple、log4j-slf4j-impl)被引入,这些会覆盖logback的绑定。如果有,排除对应依赖:
libraryDependencies += "第三方依赖组" %% "依赖名" % "版本" exclude("org.slf4j", "slf4j-simple")
- 确认logback-classic与logstash-logback-encoder版本兼容:比如logback-classic 1.4.x对应logstash编码器7.x/8.x版本,版本不匹配会导致编码器无法正常工作。
5. 验证Configurator是否被加载
在LoggingConfigurator的configure方法开头加一句打印(比如println("Custom Logback Configurator loaded!")),运行应用看是否输出这句话。如果没有,说明SPI注册失败,Logback未找到你的配置类。
内容的提问来源于stack exchange,提问作者Zia Ur Rehman
相关产品推荐
相关产品推荐

