2011-09-29 17 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'相同的参数。 –

相关问题