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] = { .. }
}
上記のコードを実行すると、アプリからのログと KCL からのログが JSON アペンダーによって正しくフォーマットされます。
使用しようとすると問題が発生しますcats.effects.IOApp
:
import cats.effects._
object Main extends IOApp {
def run(args: List[String]): IO[ExitCode] = { .. }
}
このバージョンを実行すると、アプリからのログは引き続き JSON アペンダーによって正しくフォーマットされますが、KCL からのログはデフォルトの基本ロガーに戻ります。
これをボンネットの下での使用に絞り込みました。ボンネットの下で本質的に行っているFiber
ことを使用すると、問題を再現できます。私は JVM で実行しているので、これは内部で実行されているコードです。run(args.toList).start.flatMap(_.join).unsafeRunSync
IOApp
私の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>