Приложение logback.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, поэтому это код, который работает под капотом.

My 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>

person tmortiboy    schedule 15.08.2018    source источник


Ответы (1)


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

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

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

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

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

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

person tmortiboy    schedule 15.08.2018