gpt4 book ai didi

scala - 如何使用 testng、slf4s 和 logback 在 scala 单元测试中进行日志记录

转载 作者:行者123 更新时间:2023-12-03 01:38:35 26 4
gpt4 key购买 nike

我是 Scala 新手,不太熟悉 Java 的最新发展,所以我遇到了一个我认为是基本问题的问题。

我正在编写一些 Scala 代码,并使用 ScalaTest 和 TestNG 通过测试装置对其进行测试。测试中的代码使用 slf4s 来执行日志记录,并由 logback 支持。

在我的“build.sbt”文件中,我有我需要的所有库的依赖项:

scalaVersion := "2.9.1"

// Add test dependencies on scalatest and testng

libraryDependencies ++= Seq("org.scalatest" %% "scalatest" % "1.6.1" % "test", "org.testng" % "testng" % "6.1.1" % "test")

// Use the slf4j logging facade for logging
libraryDependencies += "org.slf4j" % "slf4j-api" % "1.6.3"

//use the slf4j connectors to implement the JCL logging facade in terms of slf4j (which in turn is implemented in terms of logback)
//confused yet?
libraryDependencies += "org.slf4j" % "jcl-over-slf4j" % "1.6.3"

//use logback for the back-end slf4j logging impl.
libraryDependencies ++= Seq("ch.qos.logback" % "logback-core" % "0.9.30", "ch.qos.logback" % "logback-classic" % "0.9.30")

//use slf4s to expose the slf4j logging facade in scala

libraryDependencies += "com.weiglewilczek.slf4s" %% "slf4s" % "1.0.7"

//Add the dispatch HTTP client dependency

libraryDependencies ++= Seq(
"net.databinder" %% "dispatch-http" % "0.8.5"
)

//I can't figure out how to use the dispatch HTTP client library, so just use the apache one

libraryDependencies += "org.apache.httpcomponents" % "httpclient" % "4.1.2"

我像这样执行日志记录(为了可读性而简化代码):

class MyClass extends Logging {
def doSomething() {
logger.debug("Hello world")
}
}

当我运行测试来执行此代码时(使用“sbt test”命令),我没有看到调试消息,但我确实看到此消息打印到控制台:

    SLF4J: The following loggers will not work because they were created
SLF4J: during the default configuration phase of the underlying logging system.
SLF4J: See also http://www.slf4j.org/codes.html#substituteLogger
SLF4J: MyClass

我在 src/test/resources 中有一个 logback.xml 文件,当我看到 Apache HttpClient 库(使用 JCL)的输出时,我知道日志记录本身正在工作。

我错过了什么吗?我记录的信息有助于通过测试探索代码的行为,而且这似乎应该可行。我当然已经阅读了http://www.slf4j.org/codes.html#substituteLogger页面但我不知道在配置日志子系统之前如何创建我的记录器。

更新:这是我的 logback.xml 的内容:

<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} %line --- %msg%n</pattern>
</encoder>
</appender>

<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>

最佳答案

我认为这是因为 SBT 并行运行测试,并且 Slf4j 中的一些初始化代码不是线程安全的(!)。请参阅http://jira.qos.ch/browse/SLF4J-167 ……两年多前就已经报道过了!

作为解决方法,我通过在测试运行之前加载根记录器来初始化 Slf4j。为此,只需将其添加到您的 SBT 设置中即可:

testOptions += Setup( cl =>
cl.loadClass("org.slf4j.LoggerFactory").
getMethod("getLogger",cl.loadClass("java.lang.String")).
invoke(null,"ROOT")
)

关于scala - 如何使用 testng、slf4s 和 logback 在 scala 单元测试中进行日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7898273/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com