【问题标题】:How to automatically log the entry/exit of methods in Java?如何自动记录Java中方法的进入/退出?
【发布时间】:2012-09-25 18:32:40
【问题描述】:

现在我正在使用java.util.logging 来记录我的Java 项目中每个方法的入口和出口点。这在调试时对我非常有用。

我在每个方法的开头都有这段代码,在结尾处有类似的代码:

if (logger.isLoggable(Level.FINER)) {
    logger.entering(this.getClass().getName(), "methodName");
}

其中“methodName”是方法的名称(硬编码)。

所以我想知道是否有一种方法可以自动执行此操作,而不必在每个方法中都包含此代码。

【问题讨论】:

    标签: java logging methods java.util.logging


    【解决方案1】:

    我建议使用面向方面的编程。

    例如,使用AspectJ编译器(可以集成到Eclipse、Emacs和其他IDE),你可以创建这样一段代码:

    aspect AspectExample {
        before() : execution(* Point.*(..))
        {
             logger.entering(thisJoinPointStaticPart.getSignature().getName(), thisJoinPointStaticPart.getSignature().getDeclaringType()   );
    
        }
    
        after() : execution(* Point.*(..))
        {
             logger.exiting(thisJoinPointStaticPart.getSignature().getName() , thisJoinPointStaticPart.getSignature().getDeclaringType()  );
    
        }
    }
    

    此方面在“Point”类中的所有方法执行前后添加了一个日志记录代码。

    【讨论】:

    • 它可以在离线应用程序中使用吗?哪些不在服务器上运行?
    • @ArturasM 是的,AspectJ 字节码被编织到目标类中,所以它直接在 JVM 中执行。因此,任何符合 Java 规范的 JVM 都可以运行它。
    【解决方案2】:

    您应该查看Aspect oriented programming。我建议您将 Spring AOPAspectJ 作为您应该查看的内容。

    另外,这里有一个快速教程可以帮助您开始使用Logging with Spring AOP

    【讨论】:

    • 但我不认为 Spring 在不在服务器上运行的离线应用程序中工作,是吗?那么 AspectJ 呢?
    【解决方案3】:

    如前所述,将 AOP 与来自 jcabi-aspects@Loggable 注释一起使用(我是开发人员):

    @Loggable(Loggable.DEBUG)
    public String load(URL url) {
      return url.openConnection().getContent();
    }
    

    该库还包含一个 AOP 方面,它可以理解这些注释并通过 SLF4J 自动记录方法调用、它们的参数和执行时间。

    另外,请查看解释详细信息的博客文章:http://www.yegor256.com/2014/06/01/aop-aspectj-java-method-logging.html

    【讨论】:

      【解决方案4】:

      你试过看slf4j吗?它有LocationAwareLogger可以自动收集方法名。

      【讨论】:

        【解决方案5】:

        您应该查看Aspect Oriented Programming,尤其是around() 连接点,这对于记录您希望在定义中限定的方法的进入和退出很有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多