如何调试大型服务器端分布式Java应用程序

如何调试大型服务器端分布式Java应用程序,java,debugging,log4j,distributed-computing,Java,Debugging,Log4j,Distributed Computing,这是我的问题:我正试图调试ApacheCassandra并理解应用程序的流程。例如,当客户端发送请求时,例如put(),调用什么方法以及系统内部如何工作 因此,以下是我的想法: 在cassandra代码中编写一个main方法,调用入口点put()方法,在eclipse中放置断点等 不要编写main方法,只需使用常规客户端(通过TCP访问服务器)和使用log4j记录器(已经在cassandra中实现)进行“调试”(通过读取日志文件并理解代码) 那么,我的问题是,调试这样一个分布式应用程序的理想方式

这是我的问题:我正试图调试ApacheCassandra并理解应用程序的流程。例如,当客户端发送请求时,例如put(),调用什么方法以及系统内部如何工作

因此,以下是我的想法:

  • 在cassandra代码中编写一个main方法,调用入口点put()方法,在eclipse中放置断点等
  • 不要编写main方法,只需使用常规客户端(通过TCP访问服务器)和使用log4j记录器(已经在cassandra中实现)进行“调试”(通过读取日志文件并理解代码)
  • 那么,我的问题是,调试这样一个分布式应用程序的理想方式是什么?

    使用log4j,将其设置在
    put()
    之前,然后在退出
    put()
    之后清除它怎么样?然后,如果您在
    put()
    中执行的方法中设置了其他日志记录,您就可以看到其中真正发生了什么。如果您深入了解该方法,请不时记录堆栈跟踪,以便查看当前所在的位置

    免责声明:我的调试优先级列表如下所示:

  • 检查堆栈跟踪
  • 检查日志文件
  • 使用调试器
  • 所以,如果1。二,。不要给我答案,我会求助于调试器


    在这样的分布式应用程序中,使用调试器听起来像是万不得已的事。

    理想的方法?两者都有,还有更多

    您提到了目标:“调试”和“理解应用程序的流程”-好的,在理解流程之前进行调试是非常困难的,但是理解本身可能就是目的

    在现实世界中,当在上处理大型分布式系统时,通常不能依赖调试器,至少在最初是这样,因为有些问题只有在系统繁忙或运行数小时后才会出现。因此,在应用程序代码和基础结构代码中,良好的调试跟踪和对该跟踪的细粒度控制至关重要

    但是,如果您有机会在一个调试程序中运行,这将非常有启发性

    在此之前,我认为您需要:

    a) 。研究可能存在的任何设计文件

    b) 。在一个好的IDE中浏览源代码,例如Eclipse。只要跟着控制按钮。嗯,这里有一个有趣的地方,想知道它是从哪里来的?在类上调用该方法,这是做什么的?什么时候调用该构造函数


    有了这些,跟踪跟踪就容易多了,而且你对断点的位置也有了更好的了解。

    在分布式应用程序中使用日志记录确实是了解在更大范围内实际发生了什么以及事情如何交互的最佳方法之一。但是,您最终将面临日志文件的问题——分布式系统可以以不同的格式和位置生成大量日志文件。因此,如果您想使用log4j(或类似的工具)处理类似的内容,您应该将日志聚合到一个位置,然后研究它们。可能会有帮助,-它不仅允许持久化聚合,还允许实时监视来自各种源的聚合日志流。例如,您可以关注来自特定主机(或主机范围)的数据层,并实时观察正在发生的事情。或者,您可以从特定机器上的特定线程获取日志,或者使用MDC上下文,如前一篇文章中所述。我也赞同这样一种观点,即分布式应用程序中的调试器在大多数情况下都是无用的,而且出于显而易见的原因,在生产系统中完全是无用的。另一方面,Log4j非常灵活,使用广泛,是最好的日志记录工具(IMHO)之一。

    使用日志,必要时增加日志级别添加更多日志语句。在分布式系统的不同组件上,配置不同的组件,如数据库、应用程序服务器、分析堆栈跟踪、在前端浏览器内置的if web app上使用调试工具以及后端断点

    那么,您说的是开发人员环境,对吗?我不关心应用程序是否正在生产中运行。我的目标是重写cassandra中的一些现有协议。事实上,最好对流程有一个印象,并通过生成预期的日志消息来验证这一点。从调试器开始只会让你陷入细节的泥潭,而你对更大的图景(如流程)一无所知。然而,在一段特定的代码上附加一个调试器(您的期望没有得到满足)会非常有启发性。+我在eclipse中发现了远程调试。这也可能有帮助吗?