0

我有一个使用 AWS Kinesis 客户端库的 scala 应用程序。

我正在使用带有 logstash 编码器的 logback 将来自我的应用程序和 KCL 的日志格式化为 JSON。

我的应用程序也是使用cats.effects.IO.

import cats.effects._

object Main extends App {

  run(args.toList).unsafeRunSync

  def run(args: List[String]): IO[ExitCode] = { .. }

}

当上面的代码运行时,来自我的应用程序和来自 KCL 的日志通过我的 JSON appender 正确格式化。

当我尝试使用时出现问题cats.effects.IOApp

import cats.effects._

object Main extends IOApp {

  def run(args: List[String]): IO[ExitCode] = { .. }

}

当这个版本运行时,来自我的应用程序的日志仍然通过我的 JSON appender 正确格式化,但来自 KCL 的日志恢复为默认的基本记录器。

我已将其范围缩小到引擎盖下的使用,并且如果我使用本质上是引擎盖Fiber下的操作,则可以重现该问题。我在 JVM 上运行,所以是在后台运行的代码。run(args.toList).start.flatMap(_.join).unsafeRunSyncIOApp

我的logback.xml

  <appender name="json" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
      <providers>
        <pattern>
          <pattern>
            {
              "level": "%level",
              "message": "%message"
            }
          </pattern>
        </pattern>
        <nestedField>
          <fieldName>properties</fieldName>
          <providers>
            <timestamp>
              <fieldName>utcTimestamp</fieldName>
              <pattern>yyyy-MM-dd'T'HH:mm:ss'Z'</pattern>
              <timeZone>UTC</timeZone>
            </timestamp>
            <arguments/>
          </providers>
        </nestedField>
        <stackTrace/>
      </providers>
    </encoder>
  </appender>

  <root level="info">
    <appender-ref ref="json" />
  </root>
</configuration>
4

1 回答 1

0

logback.xml当类路径上有多个冲突的依赖项时,依赖于自动发现意味着不能保证哪个将首先加载。

由于已经存在以下依赖项:

libraryDependencies += "org.slf4j" % "jcl-over-slf4j" % "1.7.21"

您只需要排除公共记录器:

excludeDependencies += "commons-logging" % "commons-logging"

这样,KCL 被迫使用正确的记录器,而不必选择。

于 2018-08-15T08:02:08.883 回答