对象生命周期记录

时间:2016-06-05 21:38:46

标签: java spring tomcat servlets spring-boot

有没有办法在Java 8,Tomcat 8或Spring Boot中打印出与给定对象实例相关的每个事件的列表?这在调试时非常有用。

例如,我希望能够指定一个类型并获取该类型的所有对象。我希望能够打印出给定对象发生的所有事件,例如实例化,属性值更改,函数调用,销毁等。

我想要研究的类型的一个例子是HttpSession。如果我使用HttpSession按如下方式查询当前System.out.println()

HttpSession sess = request.getSession(false);
System.out.println("request.getSession(false) is: " + sess);
String sessid = sess.getId();
System.out.println("session.getId() is: "+sessid);

结果是以下两行输出:

request.getSession(false) is: org.apache.catalina.session.StandardSessionFacade@68b26b9
session.getId() is: D490BB6B29E66D35205578D7C1E4B3EE

这会提供类型org.apache.catalina.session.StandardSessionFacade,对象引用68b26b9id属性D490BB6B29E66D35205578D7C1E4B3EE

此OP询问如何获取JVM或Tomcat或Spring使用此特定对象实例org.apache.catalina.session.StandardSessionFacade@68b26b9执行的每个事件的历史记录日志,从出生到死亡。以及如何为任何其他给定对象获取相同类型的历史记录日志。类似于堆栈跟踪,但是在整个对象生命周期中,而不是本地化为单个事件。

1 个答案:

答案 0 :(得分:0)

使用某些第三方工具(如asm或其他运行时hackery)可能会这样做。但一般来说,尝试记录这些数据将是浪费时间。

我曾经被要求支持一个系统,其中编写它的人(谁是软件架构师,而不是开发人员)决定记录每个方法调用入口和退出并且所有参数都通过是一个好主意。该系统是使用spring框架编写的,因此他通过将一个方面应用于应用程序中的所有类来完成此任务。

虽然这很有效,但它产生了一个庞大的日志,这个日志几乎无法解读,也无法用于调试。仅仅因为几乎不可能在所产生的大量信息中找到你所需要的东西。

更好的想法是使用日志框架,例如LogBackSLF4J,并在调试时将日志记录作为开发人员所需的信息。

记录,恕我直言,讲述一个系统发生了什么的故事。作为一个类比,人们更容易理解'我开车到商店 '我打开车门,坐在座位上,把钥匙放进去,把钥匙开始...... 。“。在日志中讲述应用程序的故事并生成过多信息之间找到平衡是一项非常值得学习的技能。

只是为了不同的想法。我为iOS应用编写了一个名为Story Teller的日志框架。为什么我提到这一点,故事Teller采用了一种非常不同的方法,即每个其他框架使用的 debug,warn,info 等日志记录级别。它的工作原理是允许您将任何内容记录为键,然后查询这些键。这允许在调试时进行极具针对性的记例如,记录帐号12345的所有内容。尽管如此,我还没有看到类似这样的Java。