logback.xml appender 不与猫 IOApp 一起使用
logback.xml appender not used with cats IOApp
我有一个使用 AWS Kinesis 客户端库的 Scala 应用程序。
我正在使用带有 logstash 编码器的 logback 将来自我的应用程序和 KCL 的日志格式化为 JSON。
我的App也是用cats.effects.IO
写的。
import cats.effects._
object Main extends App {
run(args.toList).unsafeRunSync
def run(args: List[String]): IO[ExitCode] = { .. }
}
当上面的代码运行时,来自我的应用程序和来自 KCL 的日志通过我的 JSON appender 被正确格式化。
当我尝试使用 cats.effects.IOApp
:
时出现问题
import cats.effects._
object Main extends IOApp {
def run(args: List[String]): IO[ExitCode] = { .. }
}
当这个版本运行时,来自我的应用程序的日志仍然通过我的 JSON appender 正确格式化,但是来自 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>
当 class 路径上存在多个相互冲突的依赖项时,依赖 logback.xml
的自动发现意味着无法保证先加载哪个。
因为已经存在依赖关系:
libraryDependencies += "org.slf4j" % "jcl-over-slf4j" % "1.7.21"
您只需要排除公共记录器:
excludeDependencies += "commons-logging" % "commons-logging"
这样 KCL 就可以强制使用正确的记录器,而不必选择。
我有一个使用 AWS Kinesis 客户端库的 Scala 应用程序。
我正在使用带有 logstash 编码器的 logback 将来自我的应用程序和 KCL 的日志格式化为 JSON。
我的App也是用cats.effects.IO
写的。
import cats.effects._
object Main extends App {
run(args.toList).unsafeRunSync
def run(args: List[String]): IO[ExitCode] = { .. }
}
当上面的代码运行时,来自我的应用程序和来自 KCL 的日志通过我的 JSON appender 被正确格式化。
当我尝试使用 cats.effects.IOApp
:
import cats.effects._
object Main extends IOApp {
def run(args: List[String]): IO[ExitCode] = { .. }
}
当这个版本运行时,来自我的应用程序的日志仍然通过我的 JSON appender 正确格式化,但是来自 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>
当 class 路径上存在多个相互冲突的依赖项时,依赖 logback.xml
的自动发现意味着无法保证先加载哪个。
因为已经存在依赖关系:
libraryDependencies += "org.slf4j" % "jcl-over-slf4j" % "1.7.21"
您只需要排除公共记录器:
excludeDependencies += "commons-logging" % "commons-logging"
这样 KCL 就可以强制使用正确的记录器,而不必选择。