2012-08-13 158 views
6

具有下面的代碼: log.info( 「參數{}和{}」,參數1,參數2) 編譯,如果我用SLF4J Scala的效果很好Scala和SLF4J ::傳遞多個參數

然而想通過更多的參數,我需要使用數組:

log.info("parameters {} and {} and {}", Array(param1, param2,param3)) 

簡單地替換第一個參數以與Array.toString和樹葉的參數綁定休息。

下面的代碼

log.info("parameters {} and {} and {}", Array(param1, param2,param3) : _*) 

不能編譯,因爲:

error: overloaded method value info with alternatives: 
(org.slf4j.Marker,java.lang.String)Unit <and> 
(java.lang.String,java.lang.Throwable)Unit <and> 
(java.lang.String,Array[java.lang.Object])Unit <and> 
(java.lang.String,Any)Unit 
cannot be applied to (java.lang.String, Any) 
log.info("parameters {} and {} and {}", Array(param1, param2,param3) : _*) 

缺少什麼我在這裏?

回答

2

你應該使用Scala的包裝器SLF4J像grizzled

如果你不綁定到SLF4J,你應該看看Logula。我最近一直在玩,我喜歡它。

+2

每個項目依賴項都是一項額外的未來維護工作。例如,@Falmarri在2012年提到的「Logula」現在被標記爲「已棄用」 – 2016-02-11 09:39:21

-1

試試這個:

Array(...).asInstanceOf[Array[Object]] 
+0

我確實嘗試過。它沒有給出錯誤,但它也沒有做正確的事情。它會將整個數組作爲字符串放在第一個參數「{}」上並保留空白... – marios 2015-08-02 05:53:11

1

我想這一切都取決於推斷出的類型。採用數組的log.info方法期望Array [AnyRef]。所以作爲替代演員,你可以做

log.info("parameters {} and {} and {}", Array[AnyRef](1, 2, "a"): _*) 

但是,這將無法正常工作,有上詮釋間的轉換的限制 - > AnyRef。對於這些,你需要一個類型歸屬:

log.info("parameters {} and {} and {}", 
    Array[AnyRef](1: Integer, 2: Integer, "a"): _*) 

看到這個問題的更多細節:Result type of an implicit conversion must be more specific than AnyRef

0

如果你使用字符串插值什麼?像這樣:

log.info(f"parameters ${param1} and ${param2} and ${param3}") 
+1

log.info(s「parameters $ {1/0}和..」)會拋出異常爲零即使在WARN日誌級別 – 2013-10-08 07:01:15

+0

是真的,你可以讓它懶惰的val雖然。 lazy val dividedByZero = f「$ {1/0}」; val levelWarn = true; if(levelWarn)println(dividedByZero); 只有當levelWarn爲true時纔會拋出NpE。我添加了分號以分隔行,因爲我無法添加CR – 2013-10-15 13:28:33

-1

這是我該怎麼做。

LOGGER.info( 「編碼:{},代碼:{},長度:{}」,陣列(messageWrapper,methodCode,bytes.length).asInstanceOf [數組[AnyRef]])

乾杯

+0

您剛剛複製此答案:http://stackoverflow.com/a/12094177/303737 – 2014-12-30 14:21:26