2011-01-29 42 views
7

CẬP NHẬT: GIẢI PHÁP !!!
hãy xem câu trả lời tôi đã thêm bên dướiSố dòng ghi chép Scala - slf4s/slf4j?


Có ai biết nếu có một cách để làm khai thác gỗ mà kết quả đầu ra số dòng thực ra cửa sổ Console? Tôi đang cố gắng để có được thành Scala ở đây, nhưng không thể có được những thứ cơ bản như thế này mà tôi phụ thuộc vào, nó thực sự khó khăn để có được nhiều đi.

Tôi đã thiết lập slf4 để bọc bằng slf4j - log4j - jcl-over-slf4j. Vấn đề là tôi nhận được số dòng mà không phù hợp với tất cả. Các số dòng cao hơn nhiều so với lớp Scala thậm chí còn chứa. Đây có phải là vì số dòng thực sự là số dòng trung gian Java không?

EASY cách để có được thiết lập đăng nhập đáp ứng các yêu cầu này ?:

  1. tương thích, làm việc với cả hai java & scala
  2. là dễ dàng để thay đổi mức độ khai thác gỗ của cá nhân các gói dễ dàng như log4j
  3. cung cấp số dòng CHÍNH XÁC.

Cảm ơn!

Jamie

Trả lời

6

Tôi đã phát hiện ra rằng logback (bởi Ceki Gülcü) hoạt động tuyệt vời và bảo tồn số dòng quá !
(Và nó hoạt động như một sự thay thế cho log4j: Awesome)

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

Đối với bất cứ ai đang gặp khó khăn để bắt đầu với Scala, đây là những gì tôi đã làm để có được những bộ xương cơ bản lên:

1) Download sbt-launcher.jar và đặt nó một nơi nào đó như /opt/
tôi đã sử dụng "sbt-launch-0.7.5.RC0.jar"

2) Tạo một kịch bản bash như một phím tắt để trình chạy SBT trong nano /opt/bin/sbt:

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

(làm cho nó thực thi)

$ sudo chmod ug+x ./sbt 

Hãy chắc chắn rằng đó là trong con đường của bạn quá.

3) Tạo và cấu hình các dự án SBT:

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

đặt này trong đó:

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) Dán những thứ từ trên vào chi tiết:

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

5) Tôi gần như quên mất! đặt điều này trong /src/main/resources/logback.xml
(nó yêu cầu để có được số dòng)

<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

Bây giờ bạn phải ở trong sbt console trong vỏ của bạn:

> update 
> compile 
> run 

Hy vọng điều này giúp.

+0

Phản hồi thú vị. Tôi sẽ thử. +1 (đừng quên rằng bạn có thể chọn câu trả lời của riêng bạn làm câu trả lời chính thức) – VonC

+1

Bạn đang giải thích ở đây là _so_ tốt hơn nhiều rồi là tài liệu sbt. Ước gì tôi đã tìm thấy câu trả lời này sớm hơn. – srparish

+0

@srparish Tôi rất vui vì nó đã giúp bạn! Tôi đã nhận được rất nhiều sự giúp đỡ trong sự nghiệp lập trình tương đối ngắn của tôi từ các bài đăng trên blog/danh sách gửi thư rác/xếp chồng mà tôi rất vui khi có thể đóng góp lại bất kỳ thứ gì tôi có thể cung cấp. – jpswain

2

Như bạn đang nhận xét trong Scala logging câu hỏi, nhận được thông tin chính xác số dòng trong Scala là khó khăn.

  • Tại sao Scala không chỉ quá tải cơ sở hạ tầng hiện có bằng cách tiết kiệm thay đổi độ lệch tuyệt đối thay vì số dòng trong LineNumberTable?
    Một cách khác để giải quyết có thể là bằng cách đánh số mã thông báo thay vì các khoảng thời gian thực tế vào tệp nguồn.
  • Mặc dù tôi thích ý tưởng lập chỉ mục theo mã thông báo, điều này có nghĩa là bất kỳ công cụ nào có khả năng sử dụng thông tin gỡ lỗi sẽ cần phải có quyền truy cập vào trình phân tích cú pháp đầy đủ.
    Một khả năng khác là định dạng lại tệp theo một số quy tắc được xác định nghiêm ngặt và sau đó tiếp tục sử dụng đánh số dòng.
  • Tôi bắt đầu làm việc để cải thiện trải nghiệm gỡ lỗi cho các chương trình Scala và một trong những điểm đau thực sự là số dòng. Lý tưởng nhất là sẽ có hỗ trợ nhiều hơn là chỉ số dòng. Tôi đang xem JSR 45 (Gỡ lỗi hỗ trợ cho các ngôn ngữ khác). Tôi không chắc chắn nếu đó là đủ, nhưng có lẽ một tầng Scala có thể sử dụng chương trình của bạn.
    Tôi nghĩ rằng cách tốt hơn là cung cấp thông tin bổ sung, cụ thể về Scala, gỡ lỗi trong thuộc tính hoặc chú thích classfile. Theo như tôi biết, JDI không cấp quyền truy cập vào các thuộc tính classfile cũng như các chú thích, nhưng có một số thủ thuật mà chúng tôi có thể sử dụng để truy cập chúng.Bằng cách này, chúng tôi sẽ bảo vệ chức năng hiện có và cho phép các công cụ để làm nhiều hơn khi họ biết về các thuộc tính Scala.

(Lưu ý: Scalate báo cáo đã thực hiện một công việc tương tự trong scalate-24 cho một loại khác nhau của file nguồn)

2

Cập nhật 2016: một thư viện như lihaoyi/sourcecode không bao gồm logging use case với một cách tiếp cận mới:

Bạn có thể sử dụng sourcecode.File và sourcecode.Line để xác định chức năng đăng nhập tự động chụp số dòng họ và tập tin tên

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 

Điều này có thể thuận tiện cho phép bạn xem vị trí của dòng nhật ký, mà không cần phải gắn thẻ mỗi câu lệnh đăng nhập với một tiền tố độc đáo.
Hơn nữa, điều này xảy ra tại thời gian biên dịch, và do đó đơn đặt hàng của cường độ nhanh hơn nhận thông tin này bằng cách tạo dấu vết ngăn xếp và hoạt động trên Scala.js nơi ngăn xếp kiểm tra không.
Cuối cùng, nếu bạn muốn thêm thông tin như tên phương thức, tên lớp hoặc gói được cung cấp cho chức năng ghi nhật ký, bạn có thể dễ dàng thực hiện việc này bằng cách yêu cầu các liên kết sourcecode.Name hoặc sourcecode.FullName hoặc sourcecode.Pkg.

0

Tôi khuyên bạn nên xem qua Scribe. Đó là giải pháp ghi nhật ký hoàn chỉnh cho Scala sử dụng Macros để tạo số dòng và thông tin khác tại thời gian biên dịch để không giảm tốc độ và được tích hợp sẵn để bạn không phải sử dụng thứ gì đó như sourcecode và tích hợp thủ công:

https://github.com/outr/scribe

Các vấn đề liên quan