logback.xml附加程序未与cats IOApp一起使用

时间:2018-08-15 06:07:55

标签: scala logback scala-cats logstash-logback-encoder cats-effect

我有一个使用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] = { .. }

}

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

当我尝试使用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上运行,所以this是在后台运行的代码。

我的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 个答案:

答案 0 :(得分:0)

当类路径上存在多个相互冲突的依赖项时,依靠logback.xml的自动发现意味着无法保证首先加载哪个。

因为已经存在以下依赖性:

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

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

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

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