Java记录器的进入/退出方法中的参数

时间:2014-12-31 14:45:13

标签: logging java.util.logging

假设使用java.util.logging.*,在myLogger.entering(...)myLogger.exiting(...)中使用哪些适当的参数?如果这些始终应该是源类名和源方法名,为什么该方法不会自己查找信息而不是要求我们呢?方法文档说:

  

这是一种便捷方法,可用于记录方法的输入。记录带有消息" ENTRY",日志级别FINER以及给定的sourceMethod和sourceClass的LogRecord。

     

这是一种方便的方法,可用于记录从方法返回。将记录带有消息" RETURN",日志级别FINER以及给定的sourceMethod和sourceClass的LogRecord。

我们是否应该简单地对方法名称进行硬编码,即使用" "?我可能不正确的理由是,如果我的getMethodName()可以接受大量使用,那么日志记录系统会自行完成,而不是向我们询问方法名称。

private static void methodNine() {
    logger.entering(LogTest.class.getName(), getMethodName());

    logger.exiting(LogTest.class.getName(), "sourceMethod");  // sourceMethod=?
}

/** @return The current method name. */
private static String getMethod() {
    return Thread.currentThread().getStackTrace()[2].getMethodName();
    //[0]=getStackTrace, [1]=getMethod, [2]=<method name we're looking for>
}

1 个答案:

答案 0 :(得分:1)

  

假设使用java.util.logging。*,在myLogger.entering(...)和myLogger.exiting(...)中使用哪些适当的参数?

根据documentation,它是源类名和源方法名。但是,在匿名类包含声明类和包含方法名以及由特殊标识符分隔的匿名方法和类名的情况下,有时可以弯曲规则。权衡的是,如果过滤器期望某种标准的类/方法格式,某些LogRecords的filtering可能会变得棘手。

  

如果这些始终应该是源类名和源方法名,为什么方法本身不会找到信息而不是要求我们呢?

创建日志API时computing the callsite at runtime was expensive compared to just supplying a constant.今天仍然有成本。

对于dynamic proxies,使用给定的方法名称而不是处理程序类和方法是很好的。此外,Java Native Interface可能无法在native code中计算当前方法。

  

我们应该简单地对方法名称进行硬编码,即使用“”吗?我可能不正确的理由是,如果我的getMethodName()所做的事情是可以接受的,那么日志记录系统就会自己做,而不是向我们询问方法名称。

取决于您的要求。如果你认为'getMethodName()'今天足够快,而X年后你正在做什么,那么你必须确定是否会有这种模式的编码债务。有一个JEP草案可以创建一个Efficient Stack Walking API,这样您将来可以提高性能。

你可以创建一个名为'methodName'的局部变量作为每个方法的第一行,并做同样的事情。