我想为我所有的Logger.debug("(事件编写通用方法。
public void debug(String message){
if(Logger.isDebugEnabled()){
LOGGER.debug(message);
}
}
在同一个类中,我将能够调用此方法来打印任何调试行。
debug("Into method xyz");
...
debug("exiting method xyz");
如果我像这样调用,日志中的每个调试行都会显示方法行号而不是原始行号。有没有办法打印实际的行号从它凸起的地方。
做你的建议是没有意义的。
看看 Log4j Logger 类的源代码(实际上是它的超类 Category,其中相关逻辑是(
729 public
730 boolean isDebugEnabled() {
731 if(repository.isDisabled( Level.DEBUG_INT))
732 return false;
733 return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());
734 }
然后检查调试方法本身:
252 public
253 void debug(Object message) {
254 if(repository.isDisabled(Level.DEBUG_INT))
255 return;
256 if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {
257 forcedLog(FQCN, Level.DEBUG, message, null);
258 }
259 }
如您所见,该方法已经执行了与isDebugEnabled()
完全相同的检查debug
。如果只记录此时未构造的单个常量字符串,则在调用debug()
之前调用isDebugEnabled()
的理由为零。
但是,如果您正在构建日志消息,并且这需要时间,那么这是有原因的:
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("The 3-millionth digit of PI is " + calculatePiDigit(3000000));
}
但是,在这种情况下,您不能从您的问题中调用您的方法debug
,因为这会破坏目的:
debug("The 3-millionth digit of PI is " + calculatePiDigit(3000000));
将始终执行冗长的计算,无论是否启用调试日志记录。
要回答您的问题:
不,在您提出的情况下,不可能获得正确的行号。但是,您提出的情况对您的应用程序也没有好处。所以,这不是问题。