我正在使用带有自定义记录器(Log4j2(的Play框架,以替换默认的播放记录器(Logback(。
我按照文档中描述的过程进行操作: https://www.playframework.com/documentation/2.6.x/SettingsLogger
在build.sbt中:
lazy val root = (project in file("."))
.enablePlugins(PlayJava)
.disablePlugins(PlayLogback)
libraryDependencies ++= Seq(
"org.apache.logging.log4j" % "log4j-slf4j-impl" % "2.4.1",
"org.apache.logging.log4j" % "log4j-api" % "2.4.1",
"org.apache.logging.log4j" % "log4j-core" % "2.4.1"
)
一切正常,直到我尝试添加一个为 Play: https://github.com/alexanderjarvis/play-jongo 编写的自定义模块
作为一个播放模块,它还有一个build.sbt,其中没有禁用Logback。
尝试使用导入的模块运行我的软件时,出现此错误:
java.lang.ClassCastException: org.apache.logging.slf4j.Log4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext
at play.api.libs.logback.LogbackLoggerConfigurator.configure(LogbackLoggerConfigurator.scala:92)
at play.api.libs.logback.LogbackLoggerConfigurator.init(LogbackLoggerConfigurator.scala:31)
at play.core.server.DevServerStart$.$anonfun$mainDev$1(DevServerStart.scala:88)
at play.utils.Threads$.withContextClassLoader(Threads.scala:21)
at play.core.server.DevServerStart$.mainDev(DevServerStart.scala:59)
at play.core.server.DevServerStart$.mainDevHttpMode(DevServerStart.scala:49)
at play.core.server.DevServerStart.mainDevHttpMode(DevServerStart.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at play.runsupport.Reloader$.startDevMode(Reloader.scala:230)
at play.sbt.run.PlayRun$$anonfun$playRunTask$1$$anonfun$apply$2$$anonfun$apply$3.devModeServer$lzycompute$1(PlayRun.scala:79)
at play.sbt.run.PlayRun$$anonfun$playRunTask$1$$anonfun$apply$2$$anonfun$apply$3.play$sbt$run$PlayRun$$anonfun$$anonfun$$anonfun$$devModeServer$1(PlayRun.scala:79)
at play.sbt.run.PlayRun$$anonfun$playRunTask$1$$anonfun$apply$2$$anonfun$apply$3.apply(PlayRun.scala:102)
at play.sbt.run.PlayRun$$anonfun$playRunTask$1$$anonfun$apply$2$$anonfun$apply$3.apply(PlayRun.scala:65)
at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
[trace] Stack trace suppressed: run last compile:run for the full output.
[error] (compile:run) java.lang.reflect.InvocationTargetException
[error] Total time: 1 s, completed 18 juin 2018 16:04:02
显然,模块中的 Logback 传递依赖项与导入的 log4j2 之间存在冲突。
所以我试图在导入 jongo 模块时排除 Logback:
"uk.co.panaxiom" %% "play-jongo" % "2.1.0-jongo1.3" exclude("ch.qos.logback", "logback-classic")
然后得到一个完全不同的错误:
[WARN] [06/18/2018 15:59:12.432] [pool-6-thread-1]
[EventStream(akka://play-dev-mode)] Logger log1-Slf4jLogger did not respond within Timeout(5000 milliseconds) to InitializeLogger(bus)
error while starting up loggers
akka.ConfigurationException: Logger specified in config can't be loaded
[akka.event.slf4j.Slf4jLogger] due to
[akka.event.Logging$LoggerInitializationException: Logger log1-Slf4jLogger did not respond with LoggerInitialized, sent instead [TIMEOUT]]
有没有人在使用自定义记录器时导入 Play 模块时遇到同样的问题?或者您对如何解决此问题有任何想法吗?
感谢您对此:)的任何(有用的(建议
PlayLogback
插件会导致"com.typesafe.play" %% "play-logback" % Play-Version
模块被添加到库依赖项中。事实上,play-jongo有这样的依赖性:http://www.mvnrepository.com/artifact/uk.co.panaxiom/play-jongo_2.12/2.1.0-jongo1.3
您需要从依赖项中排除此组件,以防止 Play 的LogbackLoggerConfigurator
尝试启动。
编辑:
要排除 Scala 依赖项,您必须在其名称中包含 scala 二进制版本:
"uk.co.panaxiom" %% "play-jongo" % "2.1.0-jongo1.3" exclude("com.typesafe.play", "play-logback_2.12")