我有一个使用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>
答案 0 :(得分:0)
当类路径上存在多个相互冲突的依赖项时,依靠logback.xml
的自动发现意味着无法保证首先加载哪个。
因为已经存在以下依赖性:
libraryDependencies += "org.slf4j" % "jcl-over-slf4j" % "1.7.21"
您只需要排除公共记录器:
excludeDependencies += "commons-logging" % "commons-logging"
这样,KCL被迫使用正确的记录器,而不必选择。