【问题标题】:Object life cycle logging对象生命周期日志记录
【发布时间】:2016-10-05 10:45:12
【问题描述】:

有没有办法在 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、对象引用68b26b9id属性D490BB6B29E66D35205578D7C1E4B3EE

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

【问题讨论】:

    标签: java spring tomcat servlets spring-boot


    【解决方案1】:

    也许可以使用一些 3rd 方工具(例如 asm)或其他运行时骇客来做到这一点。但一般来说,尝试记录这些数据是浪费时间。

    我曾经被要求支持一个系统,其中编写它的人(他是软件架构师,而不是开发人员)认为记录每个方法调用的进入和退出以及所有传递的参数是个好主意.该系统是使用 spring 框架编写的,因此他通过对应用程序中的所有类应用一个方面来做到这一点。

    虽然这行得通,但它产生了一个非常难以理解且对调试无用的大量日志。仅仅是因为在产生的大量信息中几乎不可能找到您需要的东西。

    一个更好的主意是使用诸如LogBackSLF4J 之类的日志记录框架,并将日志记录定位到开发人员在调试时需要的信息。

    记录,恕我直言,是关于讲述系统正在发生的事情的故事。打个比方,人们更容易理解“我开车去商店”“我打开车门,坐在座位上,插上钥匙,转动钥匙开始...... .'。在日志中讲述您的应用故事和产生过多信息之间找到平衡是一项非常值得学习的技能。

    只是为了想一些不同的东西。我为 iOS 应用程序编写了一个名为 Story Teller 的日志框架。我之所以提到这一点,是因为 Story Teller 采用了与其他所有框架都使用的调试、警告、信息 等日志级别非常不同的方法。它的工作原理是允许您将任何内容记录为密钥,然后针对这些密钥进行查询。这允许在调试时进行非常有针对性的日志记录。例如,记录帐号 12345 的所有内容。尽管如此,我还没有在 Java 中看到过类似的情况。

    【讨论】:

    • 您使用不同的技术(不是 java)编写了一长串的 cmets,最终导致一个完全不相关的产品的插件。人们发布问题是因为他们需要答案。将社论 cmets 放在应该回答的地方是不考虑发帖人提出问题的需要。一个对象在 Spring 应用程序中被错误处理,结果是一个阴险的、深藏不露的错误。对这个 OP 的真正回答是使丢弃的会话对象能够被附加到丢弃点,从而可以隔离错误。如果您想为此编写解决方案,我将不胜感激。
    猜你喜欢
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    相关资源
    最近更新 更多