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 вынужден использовать правильный регистратор вместо того, чтобы выбирать.