2011-09-29 20 views
1

這裏就是我在尋找:是否有支持智能參數擴展的String.format一個Java庫,多

  • 的Java
  • 日誌庫,它可以代替通用日誌或SLF4J
  • 只有參數擴展時日誌級別需要時(即,沒有if (log.isDebugEnabled())塊)
  • 字符串格式化相同java.lang.String.format
  • 檢測java.lang.Throwable中作爲最後一個參數和日誌STAC ķ跟蹤

的目標是這樣寫代碼

private static final Log log = new Log.getLog(MyClass.class); 
// ... 
String value = "test"; 
log.debug("The value is [%s]", value); // [1] 
// ... 
} catch (Exception e) { 
    log.error("Caught Exception: %s", e.getMessage(), e); // [2] 
} 

[1]將打印日誌語句像

The value is [test] 

如果日誌級別是INFO,字符串格式化操作不會發生。

[2]將打印

Caught Exception: [value of e.getMessage()] 
java.lang.Exception 
    at com.my.org.MyClass.myMethod(MyClass.[line number]) 
    at [...] 

這似乎已相當健全的行爲給我。我很驚訝,我不能輕易找到這樣做的圖書館。

編輯:我應該指定,但slf4j不符合所有這些要求。

+1

AFAIK,參數擴展或使用評估在Java中是不可能的。任何傳遞給方法的表達式參數(例如'obj.toString()')都必須事先進行評估。許多框架(特別是sl4j)通過接受'Object'而不是'String'提供了一個巧妙的技巧,所以'obj.toString()'只有在需要時纔會完成。除此之外,運氣不佳。 :-) –

回答

7

的Java

與SLF4J的logback結合。

日誌庫,它可以代替通用日誌或SLF4J

唯一公認的替代品Log4j和java.util.logging ...只有

參數擴展當日志級別需要時(即無if(log.isDebugEnabled())blocks)

在SLF4J中如果輸入:

log.debug("Names are: {}", namesCollection); 

那麼昂貴toString()纔會執行,如果isDebugEnabled()真(無需顯式地提供它)。

字符串格式與java.lang.String相同。格式

你真的需要在日誌文件中花哨的格式(小數,貨幣,區域設置)嗎?或者是{}懶惰擴展足夠(見上文)?

檢測java.lang.Throwable中的最後一個參數和日誌堆棧跟蹤

SLF4J以這種方式工作since 1.6

+0

感謝您的迴應,但我目前使用slf4j。它不符合我所有的要求(即String.format格式)。 –

+0

@three_cups_of_java,'%d','%f','%s'是什麼讓你知道'{}'不?我能想到的唯一想法就是如果你想做類似%2.2f的事情。但說實話,你的日誌應該像商業報告一樣格式化,你會想要原始輸出。 –

+0

@TimBender,它爲我購買什麼真的很重要?問題是要求一個日誌庫擴展與'String.format'相同的參數。 –

相關問題