[英]Scala logging line numbers - slf4s/slf4j?
更新:已解決!
請參閱下面我添加的答案
有沒有人知道是否有辦法將實際行號輸出到控制台? 我在這里試圖進入Scala,但是由於我沒有能夠得到這樣的基本東西,所以很難得到很多東西。
我已經設置了slf4s來包裝slf4j - log4j - jcl-over-slf4j。 問題是我得到的行號根本不匹配。 比Scala類甚至包含的行數要高得多。 這是因為行號實際上是Java中間行號嗎?
是否有任何簡單的方法來設置滿足這些要求的日志記錄?:
謝謝!
傑米
我發現logback
(由CekiGü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
希望這可以幫助。
更新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
數量級,並且在Scala.js
上工作,而堆棧檢查則不行 。
最后,如果您希望向日志記錄功能提供方法名稱,類名稱或包等附加信息,可以通過詢問sourcecode.Name
或sourcecode.FullName
或sourcecode.Pkg
含義來輕松完成。
當您在Scala日志記錄問題中進行評論時,在Scala中獲取精確的行號信息很難。
- 為什么Scala不僅僅通過在
LineNumberTable
保存絕對偏移而不是行號來重載現有基礎設施?
另一種尋址方式可以是將令牌編號而不是實際的偏移編號到源文件中。- 雖然我喜歡通過令牌進行索引的想法,但這意味着任何能夠使用調試信息的工具都需要能夠訪問完整的解析器。
另一種可能性是根據一些嚴格定義的規則重新格式化文件,然后繼續使用行編號。- 我開始致力於改進Scala程序的調試體驗,其中一個痛點就是行號。 理想情況下,支持的不僅僅是行號。 我正在研究JSR 45 (其他語言的調試支持)。 我不確定這是否足夠,但也許Scala階層可以使用你的方案。
我認為更好的方法是在classfile
屬性或注釋中提供額外的Scala特定調試信息。 據我所知,JDI不提供對classfile
屬性的訪問,也不提供對注釋的訪問,但是我們可以使用一些技巧來獲取它們。 這樣我們就可以保留現有功能,並允許工具在了解Scala屬性時執行更多操作。
(注意: Scalate報告在scalate-24中針對不同類型的源文件執行了類似的工作)
我建議看看Scribe。 它是Scala使用宏在編譯時生成行號和其他信息的完整日志記錄解決方案,因此速度沒有降低,而且它是內置的,因此您不必使用類似sourcecode
東西並手動集成它:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.