0

AWS Kinesis Client Library を使用する 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 アペンダーによって正しくフォーマットされます。

使用しようとすると問題が発生しますcats.effects.IOApp

import cats.effects._

object Main extends IOApp {

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

}

このバージョンを実行すると、アプリからのログは引き続き JSON アペンダーによって正しくフォーマットされますが、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"

commons ロガーを除外するだけです。

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

このようにして、KCL は選択する必要がなく、正しいロガーを使用するように強制されます。

于 2018-08-15T08:02:08.883 に答える