Scala 日志记录行号与使用 slf4s/slf4j 不匹配?

问题描述 投票:0回答:4

有谁知道是否有一种方法可以进行日志记录,将真实的行号输出到控制台? 我正在尝试在这里进入 Scala,但是如果无法获得我所依赖的像这样的基本东西,那么真的很难取得进展。

我已经设置了 SLF4J 以使用 slf4j - log4j - jcl-over-slf4j 进行包装。 问题是我得到的行号根本不匹配。 它们的行数甚至比 Scala 类包含的行数要高得多。 这是因为行号实际上是 Java 中间行号吗?

是否有任何EASY方法来设置满足这些要求的日志记录?:

  1. 可互操作,可与 Java 和 Scala 一起使用
  2. 像 Log4j 一样轻松更改单个包的日志记录级别
  3. 提供准确的行号。
scala logging slf4j
4个回答
7
投票

我发现

logback
(由Ceki Gülcü)效果很好并且也保留了行号!
(它可以替代
log4j
:太棒了!)

import ch.qos.logback._
import org.slf4j._

object Main {

    def logger = LoggerFactory.getLogger("Main")
    var thingy = {
        x:Int =>
        logger.info("x=" + x)
        x + 1
    }
    def main(args: Array[String]) {
        logger.info("Hello.")
        logger.info("Hello again!")

        val myInts : List[Int] = List(-25,1,5,20)

        val myInts2 : List[Int] = myInts.filter { x:Int => x > 0 }

        logger.info("my ints2:" + myInts2)

        val myInts3 = myInts2.map(p =>  p * 2 )
        logger.info("my ints3:" + myInts3)

        logger.info(thingy(1) + "")
    }
}

对于那些努力开始使用 Scala 的人,这就是我为建立基本框架所做的事情:

1) 下载

sbt-launcher.jar
并将其放在
/opt/

之类的地方 我用了“
sbt-launch-0.7.5.RC0.jar

2)创建一个 bash 脚本作为

nano /opt/bin/sbt
中 sbt 启动器的快捷方式:

#!/bin/bash
java -jar /opt/sbt-launch-0.7.5.RC0.jar "$@"

(使其可执行)

$ sudo chmod ug+x ./sbt

确保它也在您的路径中。

3)创建并配置sbt项目:

$ mkdir ./sc01
$ cd ./sc01
$ sbt
$ mkdir ./project/build</pre>
$ nano ./project/build/Project.scala</pre>

把这个放在那里:

import sbt._

class sc01(info: ProjectInfo) extends DefaultProject(info)
{
    // dependencies
    val logback_core = "ch.qos.logback" % "logback-core" % "0.9.24" % "compile" //LGPL 2.1
    val logback_classic = "ch.qos.logback" % "logback-classic" % "0.9.24" % "compile" //LGPL 2.1
    val log4j_over_slf4j = "org.slf4j" % "log4j-over-slf4j" % "1.6.1"


   // if you are going to have any unmanaged (manually-added) jars
   //    def baseDirectories = "lib"
   //    def extraJars = descendents(baseDirectories, "*.jar")
   //    override def unmanagedClasspath = super.unmanagedClasspath +++ extraJars

    // tasks - easy to define
    lazy val hi = task { println("Hello World"); None }

    // classpath
    //override def mainScalaSourcePath = "src"

}

4)将上面的内容粘贴到Main中:

$ nano ./src/main/scala/Main.scala

5)我差点忘了!把这个放进去

/src/main/resources/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>

6)

$ sbt

现在您应该位于 shell 的

sbt
控制台中:

> update
> compile
> run

希望这有帮助。


2
投票

正如您在 Scala 日志记录 问题中评论的那样,在 Scala 中获取精确的行号信息很困难。

  • 为什么 Scala 不只是通过保存来使现有基础设施超载 绝对偏移量而不是
    LineNumberTable
    中的行号?
    另一种寻址方式是对标记进行编号,而不是对标记进行编号。 源文件中的实际偏移量。
  • 虽然我喜欢通过标记进行索引的想法,但这意味着任何能够使用调试信息的工具都需要访问完整的解析器。
    另一种可能性是根据一些严格定义的规则集重新格式化文件,然后继续使用行编号。
  • 我开始致力于改善 Scala 程序的调试体验,其中的痛点确实是行号。理想情况下,不仅仅支持行号。我正在查看 JSR 45(对其他语言的调试支持)。我还不确定这是否足够,但也许 Scala 层可以使用你的方案。
    我认为更好的方法是在
    classfile
    属性或注释中提供额外的、Scala 特定的调试信息。据我所知,JDI 不允许访问
    classfile
    属性,也不允许访问注释,但是我们可以使用一些技巧来访问它们。这样我们就可以保留现有功能,并允许工具在了解 Scala 属性时执行更多操作。

(注意:Scalate 报告已在 scalate-24 中针对不同类型的源文件完成了类似的工作)


2
投票

2016 年更新:像

lihaoyi/sourcecode
这样的库确实包含采用新方法的 日志记录用例

您可以使用 sourcecode.File 和 sourcecode.Line 定义自动捕获行号和文件名的日志函数

def log(foo: String)(implicit line: sourcecode.Line, file: sourcecode.File) = {
  println(s"${file.value}:${line.value} $foo")
}

log("Foooooo") // sourcecode/shared/src/test/scala/sourcecode/Tests.scala:86 Fooooo

这可以很方便地让您查看日志行的来源,而无需用唯一的前缀繁琐地标记每个日志语句。
此外,这发生在编译时,因此比通过生成堆栈跟踪获取此信息要快几个数量级,并且适用于

Scala.js
,而堆栈检查则不能
最后,如果您想要向日志记录函数提供其他信息,例如方法名称、类名称或包,您可以通过询问
sourcecode.Name
sourcecode.FullName
sourcecode.Pkg
隐式来轻松实现。


0
投票

我建议看看 Scribe。它是 Scala 的完整日志记录解决方案,使用宏在编译时生成行号和其他信息,因此速度不会降低,而且它是内置的,因此您不必使用

sourcecode
之类的东西并手动集成它:

https://github.com/outr/scribe

© www.soinside.com 2019 - 2024. All rights reserved.