在Andreas' answer大厦,我能想到的几个方法来只进行格式化的问题,如果Logger.isDebugEnabled
回报true
:
方案1:通过在“不格式化”标志
一个选项是有一个方法参数,用于指示是否实际执行格式化。一个用例可能是:
System.out.println(lazyFormat(true, "Hello, %s.", "Bob"));
System.out.println(lazyFormat(false, "Hello, %s.", "Dave"));
当输出为:
Hello, Bob.
null
为lazyFormat
的代码是:
private String lazyFormat(boolean format, final String s, final Object... o) {
if (format) {
return String.format(s, o);
}
else {
return null;
}
}
在这种情况下,只执行String.format
当format
标志设置为true
,并且如果它设置为false
它将返回一个null
。这将停止记录消息的格式化并仅发送一些“虚拟”信息。
因此,一个用例的记录器可能是:
logger.debug(lazyFormat(logger.isDebugEnabled(), "Message: %s", someValue));
这种方法并不完全适合被要求在这个问题的格式。
选择2:检查记录器
另一种方法是要求记录器直接,如果它isDebugEnabled
:
private static String lazyFormat(final String s, final Object... o) {
if (logger.isDebugEnabled()) {
return String.format(s, o);
}
else {
return null;
}
}
在这种方法中,预计logger
将在lazyFormat
可见方法。而这种做法的好处是,主叫方将不需要检查isDebugEnabled
方法时lazyFormat
被调用,所以典型用途可以是:
logger.debug(lazyFormat("Debug message is %s", someMessage));
Log4J的较新版本允许参数替换请参阅 http://stackoverflow.com/a/14078904/620113 – computermacgyver 2013-01-24 04:26:13