有没有办法在 Java 8、Tomcat 8 或 Spring Boot 中打印出与给定对象实例关联的每个事件的列表?这对调试非常有帮助。
例如,我希望能够指定一个类型并获取该类型的所有对象。而且我希望能够打印出给定对象发生的所有事件,例如实例化、属性值更改、函数调用、销毁等。
我想研究的一个类型示例是 HttpSession
。如果我使用 System.out.println()
查询当前的 HttpSession
:
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
、对象引用 68b26b9
和 id
属性 D490BB6B29E66D35205578D7C1E4B3EE
。
此 OP 询问如何获取 JVM 或 Tomcat 或 Spring 使用此特定对象实例执行的每个事件的历史记录org.apache.catalina.session.StandardSessionFacade@68b26b9
,从出生到死亡。以及如何为任何其他给定对象获取此类历史日志。类似于堆栈跟踪,但跨越整个对象生命周期,而不是局限于单个事件。
最佳答案
使用一些第 3 方工具(如 asm 或其他运行时黑客)可能会做到这一点。但一般来说,尝试记录这些数据会浪费时间。
我曾经被要求支持一个系统,在这个系统中,编写它的人(他是软件架构师,而不是开发人员)决定记录每个方法调用的进入和退出以及所有传递的参数是个好主意.该系统是使用 spring 框架编写的,因此他通过将一个方面应用于应用程序中的所有类来实现这一点。
虽然这行得通,但它会生成大量日志,该日志几乎无法辨认且对调试毫无用处。仅仅是因为在生成的大量信息中几乎不可能找到您需要的东西。
一个更好的主意是使用日志框架,例如 LogBack或 SLF4J并针对开发人员在调试时需要的信息进行日志记录。
日志记录,恕我直言,是关于讲述系统正在发生的事情的故事。打个比方,人们理解“我开车去商店”比“我打开车门,坐在座位上,把 key 放进去,转动 key 开始……”要容易得多。 .'。在日志中讲述您的应用故事与产生过多信息之间找到平衡是一项非常值得学习的技能。
只是为了想点不一样的东西。我为 iOS 应用程序编写了一个名为 Story Teller 的日志记录框架。 .我之所以提到这一点,是因为 Story Teller 在 debug、warn、info 等所有其他框架使用的日志记录级别上采用了一种非常不同的方法。它的工作原理是允许您将任何内容记录为键,然后查询这些键。这允许在调试时进行非常有针对性的日志记录。例如,记录帐号 12345 的所有内容。尽管如此,我还没有看到类似 Java 的任何内容。
关于java - 对象生命周期记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37647040/