2013-04-02 68 views
2

在Java中,我會寫logger.getLogger(NameOfClass.class)。如何在Scala中編寫相同的代碼?什麼是Scala的Java類類型的模擬,例如讓Foo.class?

+0

爲什麼你稱它爲* binary *? –

+4

可能重複[什麼是Java的ClassName.class的Scala等價物?](http://stackoverflow.com/questions/1166732/what-is-the-scala-equivalent-of-javas-classname-class) –

回答

8

你可以嘗試:

logger.getLogger(getClass()) 

或:

logger.getLogger(classOf[NameOfClass]) 

作爲一個側面說明,ScalaLogging提供使用記錄器與類名,但沒有所有的樣板的一個很好的和簡單的方法像普通的java一樣。你在你的類的設置得到正確記錄,所有你需要做的是延長特質Logging

class MyClass extends Logging { 
    logger.debug("This is very convenient ;-)") 
} 
+0

但是那麼你不得不在任何你想要登錄的地方添加一個特質?這對我來說似乎更糟糕。 – david

+0

但是你不必做'val logger = logger.getLogger(NameOfClass.class)'或'if(logger.isDebugEnabled)'等等...所以它的樣板文件更少,這是更好的:) – Noah

+2

@david明確創建記錄器每次都不是樣板? –

1

不要忘記定義單同伴對象記錄器:

object MyClass { 
    // Commons logging 
    private val clLogger = LogFactory.getLog(getClass()) 

    // java.util.logging 
    private val juLogger = Logger.getLogger(getClass().toString) 

} 

class MyClass { 
    import MyClass._ 

    ... 
} 

的人們應該這樣做的原因是,如果您將該字段放置在class上,則該實例字段會在該類的對象的每個new實例上返回記錄器工廠。對於某些類,這可能是不必要的/不可接受的性能。

在這種情況下,Scala對類(靜態)字段和實例字段的分離使得這比使用Java所做的更加艱鉅。其中一種情況下斯卡拉不具備所有優勢:

class MyClass { 
    // Commons logging 
    private static final Log clLogger = LogFactory.getLog(MyClass.class) 

    // java.util.logging 
    private static final Logger juLogger = Logger.getLogger(MyClass.class.toString) 

    ... 
} 
+0

這有點奇怪,只是對於一些靜態字段,我已經定義了另一個更多的類... –

+0

它很笨拙,但是替代方法會在類實例的每個'new'上引入運行時開銷(日誌工廠)。 –