2011-01-29 12 views
7

更新:SOLVED !!!
コンソールに真の行番号を出力し、ロギングを行う方法がある場合は、誰もが知っていますか?私はスラングロギング行番号 - slf4s/slf4j?


の下に追加の回答を参照してください。私はここでScalaに取り込もうとしていますが、このような基本的なものを手に入れることができないと、私が頼りにしていることがなくなります。

私はslf4j-log4j-jcl-over-slf4jでラップするようにslf4sを設定しました。問題は、私は全く一致しない行番号を取得することです。 Scalaクラスよりもはるかに高い行番号が含まれています。これは、行番号が実際にJava中間行番号であるためですか?

個々のログレベルを変更するように簡単にJavaの& Scalaの

  • 両方と協力して、これらの要件?:

    1. は、相互運用可能満たしているログを設定取得するために任意のEASY方法はありますlog4j
    2. のような簡単なパッケージは、正確な行番号を提供します。

    ありがとう!

    ジェイミー

  • 答えて

    6

    Ceki Gülcüによる)logbackは素晴らしい作品とあまりにも行番号を維持することを私が発見しました!
    (そして、それはlog4jの代替として機能します!恐ろしい)はScalaを使い始めるのに苦労し、誰のために

    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) + "") 
        } 
    } 
    

    、これは私が基本骨格を得るために何をしたかである:

    1)Download sbt-launcher.jar

    :そして私は「 sbt-launch-0.7.5.RC0.jar

    2)nano /opt/bin/sbt中SBTランチャーへのショートカットとしてbashスクリプトを作成して使用/opt/
    のようにどこかにそれを置きます

    #!/bin/bash 
    java -jar /opt/sbt-launch-0.7.5.RC0.jar "[email protected]" 
    

    $ sudo chmod ug+x ./sbt 
    

    それはあまりにもあなたのパスにあることを確認します(それが実行可能に)。

    3)のsbtプロジェクトを作成および構成:

    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)主に上からものを貼り付けます:

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

    はこのそこにを置くを) 忘れそうだった!

    > update 
    > compile 
    > run 
    

    ・ホープ、この:

    <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

    今、あなたはあなたのシェルでsbtコンソールにする必要があります(行番号を取得するために必須です)/src/main/resources/logback.xml
    でこれを置きます助けてください。

    +0

    興味深いフィードバックです。私はそれを試してみましょう。 +1(あなた自身の答えを公式のものとして選択できることを忘れないでください) – VonC

    +1

    ここでの説明は、sbtの文書よりもはるかに優れています。早くこの答えを見つけて欲しいです。 – srparish

    +0

    @srparishそれがあなたを助けてくれてうれしい!私は、ブログ記事/スタックオーバーフロー/メーリングリストからの比較的短いプログラミングキャリアで非常に助けになりました。私が提供できるものを返すことができてうれしいです。 – jpswain

    2

    あなたはScala logging質問にコメントしている通り、スカラ座での正確な行番号情報を取得することは困難です。

    • なぜScalaはちょうど を保存することにより、既存のインフラをオーバーロードしませんLineNumberTableの行番号の代わりに絶対オフセット?
      の代わりにトークンに番号を付けることで、ソースファイルへの実際のオフセットを指定することもできます。
    • 私はトークンでインデックスを作成するのが大好きですが、これはデバッグ情報を使用できるすべてのツールが完全なパーサーにアクセスする必要があることを意味します。
      厳密に定義されたルールのセットに従ってファイルを再フォーマットし、引き続き行番号を使用することもできます。
    • 私はScalaプログラムのデバッグ経験を向上させるために作業を始めました。そして、痛い点の1つは実際に行番号です。理想的には、単なる行番号以上のサポートがあるでしょう。私はJSR 45(他の言語のデバッグサポート)を見ています。私はまだそれが十分であるかどうかはわかりませんが、おそらくScalaの層があなたの計画を使用できるかもしれません。
      より良い方法は、スカラ固有の追加のデバッグ情報をclassfileの属性または注釈に追加することです。私が知る限り、JDIはclassfile属性やアノテーションにアクセスすることはできませんが、それらにアクセスするために使用できるトリックがあります。このようにして、既存の機能を保持し、ツールがScalaの属性を知っているときに、より多くのことを可能にします。

    (注意:Scalateレポートは、ソースファイルの異なる種類のscalate-24で同様の仕事をした)

    2

    アップデート2016:あなたは自動的に行番号とファイル名

    をキャプチャするログ機能を定義するためにsourcecode.Fileとsourcecode.Lineを使用することができます

    lihaoyi/sourcecodeのようなライブラリは、新しいアプローチでlogging use caseを含んでいます

    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で動作します(stack-inspectionがではありません)。
    最後に、メソッド名、クラス名、パッケージなどの追加情報をロギング機能に提供したい場合は、sourcecode.Nameまたはsourcecode.FullNameまたはsourcecode.Pkgのインプリシットを要求することで簡単に行うことができます。

    0

    私はスクライブを見てみることをお勧めします。 Scalaはマクロを使ってコンパイル時に行番号やその他の情報を生成し、スピードの低下がないので、sourcecodeのようなものを使用せずに手動で組み込むことができます。

    https://github.com/outr/scribe