You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:30:17