log4j 中类中所有调试行的 Java 单一方法



我想为我所有的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));

将始终执行冗长的计算,无论是否启用调试日志记录。

要回答您的问题:

不,在您提出的情况下,不可能获得正确的行号。但是,您提出的情况对您的应用程序也没有好处。所以,这不是问题。

最新更新