簡體   English   中英

org.slf4j.helpers.SubstituteLogger 不能轉換為 ch.qos.logback.classic.Logger

[英]org.slf4j.helpers.SubstituteLogger cannot be cast to ch.qos.logback.classic.Logger

我見過一些與這個非常相似的問題( 比如這個),但沒有一個得到好的答案,或者至少一個解釋或解決了這個問題

我能夠創建一個非常小的項目(基本上是 2 個 Scala 類 - 每個都有一個記錄器 - 和 2 個測試類),其結構與我發現問題的真實項目相似。 該示例可在此處獲得:項目示例

當我運行sbt test時出現問題,導致以下錯誤:

{14:43:41} (#47) ~/Desktop/logger-exp/log-exp@pedrorijo(master) $ sbt test
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=384m; support was removed in 8.0
[info] Loading global plugins from /Users/pedrorijo/.sbt/0.13/plugins
[info] Loading project definition from /Users/pedrorijo/Desktop/git/scala/logger-exp/log-exp/project
[info] Set current project to log-exp (in build file:/Users/pedrorijo/Desktop/git/scala/logger-exp/log-exp/)
[info] HelloTest:
[info] Exception encountered when attempting to run a suite with class name: HelloTest *** ABORTED ***
[info]   java.lang.ExceptionInInitializerError:
[info]   at HelloTest$$anonfun$1.apply$mcV$sp(HelloTest.scala:8)
[info]   at HelloTest$$anonfun$1.apply(HelloTest.scala:8)
[info]   at HelloTest$$anonfun$1.apply(HelloTest.scala:8)
[info]   at org.scalatest.Transformer$$anonfun$apply$1.apply$mcV$sp(Transformer.scala:22)
[info]   at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
[info]   at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
[info]   at org.scalatest.Transformer.apply(Transformer.scala:22)
[info]   at org.scalatest.Transformer.apply(Transformer.scala:20)
[info]   at org.scalatest.FunSuiteLike$$anon$1.apply(FunSuiteLike.scala:166)
[info]   at org.scalatest.Suite$class.withFixture(Suite.scala:1122)
[info]   ...
[info]   Cause: java.lang.ClassCastException: org.slf4j.helpers.SubstituteLogger cannot be cast to ch.qos.logback.classic.Logger
[info]   at com.example.Hello$.<init>(Hello.scala:8)
[info]   at com.example.Hello$.<clinit>(Hello.scala)
[info]   at HelloTest$$anonfun$1.apply$mcV$sp(HelloTest.scala:8)
[info]   at HelloTest$$anonfun$1.apply(HelloTest.scala:8)
[info]   at HelloTest$$anonfun$1.apply(HelloTest.scala:8)
[info]   at org.scalatest.Transformer$$anonfun$apply$1.apply$mcV$sp(Transformer.scala:22)
[info]   at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
[info]   at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
[info]   at org.scalatest.Transformer.apply(Transformer.scala:22)
[info]   at org.scalatest.Transformer.apply(Transformer.scala:20)
[info]   ...
SLF4J: The following set of substitute loggers may have been accessed
SLF4J: during the initialization phase. Logging calls during this
SLF4J: phase were not honored. However, subsequent logging calls to these
SLF4J: loggers will work as normally expected.
SLF4J: See also http://www.slf4j.org/codes.html#substituteLogger
SLF4J: com.example.Hello$
14:43:52.846 [pool-6-thread-4-ScalaTest-running-WorldTest] INFO  com.example.World$ - LOGGING
[info] WorldTest:
[info] - test
[info] Run completed in 456 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 1
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
[info] *** 1 SUITE ABORTED ***
[error] Error during tests:
[error]     HelloTest
[error] (test:test) sbt.TestsFailedException: Tests unsuccessful
[error] Total time: 1 s, completed Aug 2, 2015 2:43:52 PM

但是如果我通過以下方式單獨運行每個測試:

sbt "testOnly HelloTest"sbt "testOnly WorlTest"我沒有收到任何錯誤。

據我所知,這不僅僅是 Scala 問題,似乎在 Java 中也有可能發生。 此外,我讀到在初始化期間記錄器被替換記錄器替換

但我無法理解:

  1. 為什么它只發生在測試中,以及運行兩個測試時?
  2. 為什么會發生?
  3. 如何調試/解決這個問題?

正如我之前所說,我在這里創建了一個帶有工作示例(工作,意味着發生錯誤)的存儲庫:項目示例

似乎問題出在以下語句中:

val logger = LoggerFactory.getLogger(X.getClass).asInstanceOf[Logger]

我找到了這種在某處獲取 Logger 的方法,所以我從未想過問題可能出在這一行。 最后一個方法是不必要的,它是錯誤原因。 為了停止出現所描述的錯誤,我刪除了強制轉換,將之前的表達式替換為:

val logger = LoggerFactory.getLogger(X.getClass)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM