appback logx.xml не используется с кошками IOApp

У меня есть приложение Scala, которое использует клиентскую библиотеку AWS Kinesis.

Я использую logback с кодировщиком logstash для форматирования журналов из моего приложения и 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 под капотом, и могу воспроизвести проблему, если я использую run(args.toList).start.flatMap(_.join).unsafeRunSync что по сути то, что IOApp делает под капотом. Я работаю на JVM, так что это код, который работает под капотом.

мой 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>

1 ответ

Решение

Полагаясь на автоматическое обнаружение logback.xml когда существует несколько конфликтующих зависимостей на пути к классам, это означает, что нет гарантии, какая из них будет загружаться первой.

Поскольку уже есть зависимость для:

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

Вам просто нужно исключить регистратор:

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

Таким образом, KCL вынужден использовать правильный регистратор вместо того, чтобы выбирать.

Другие вопросы по тегам