如何监视其他Java应用程序生成的exception或错误?

我想找到或开发一个可以作为守护进程运行的应用程序,当主机上运行的Java应用程序出现任何exception或错误时,通过电子邮件或短信通知管理员。 我知道JVMTI可以实现我的目标的一部分,但它会影响受监控应用程序的性能(我不知道它会有多少,如果它很轻微也是可以接受的),除了它似乎是一个麻烦的工作开发一个JVMTI代理,我不确定如果几个应用程序同时使用相同的代理运行会发生什么。 有没有更好的解决方案? 提前致谢。

一种方法是使用log4j之类的日志记录系统,它将系统A上发生的所有错误发布到系统B上的日志记录服务器,您可以从中监视发生的错误。 然而,这不是一个完全通用的解决方案,因为只会处理传播到log4j(或任何其他日志记录系统)的exception – 但它可能是一个好的开始。

最好的解决方案是让Java应用程序通过电子邮件/短信发送错误。 问题是程序会在正常操作中生成exception并正确处理。 你只想要特别的例外。

如果做不到这一点,你可以写一个日志阅读器,它读取应用程序的日志。 这很难做到,但可以做到。

应用程序每天可以生成1000+exception,并且仍然表现正常,因为应用程序知道如何处理这些exception。 例如,每次关闭套接字连接时都可以抛出exception。

IMO,最好的方法是部署外部监控系统。 这个可以:

  • 监控多个应用程序
  • 监控基础设施服务
  • 监控网络可用性和机器可访问性,
  • 监视处理器和文件系统使用情况等资源。

可以通过多种方式监控应用程序,包括:

  • 通过处理日志事件,
  • 通过观察应用程序重启,
  • 通过“ping”应用程序的web apis来检查服务的活跃度,以及
  • 通过使用应用程序的JMX接口。

可以以智能方式过滤和优先化这些信息,并且可以通过任何最合适的方式报告关键事件。

您不希望个别应用程序发送电子邮件,因为他们没有足够的信息来完成体面的工作。 此外,将报告逻辑放入单独的应用程序可能会导致实现不一致,可配置性差等等。

JVMTI附近有一个替代品: JPDA 。 此基础结构允许您使用Java代码创建远程“调试器”(是的,这是您计划执行的操作),并使用本地或远程连接将其连接到VM。

与JVMTI一样,程序执行的开销也会如此。 但是,正如Trace.java示例所示,实现和连接到目标VM非常简单。

最后,请注意,如果您想要检测应用程序服务器运行的代码(JBoss,Glassfish,Tomcat,您的名字),还有其他各种可用方法。

我遵循将每个exception记录到表中的模式。 然后RSS源从该表中选择。 我订购了MS Outlook中的RSS源,也在我的Android手机上订阅了一个名为NewsRob的程序。 NewsRob让我设置我的手机,当有新的东西时提醒我。

我在这里写博客关于如何做到这一点。 它在.net中,但你明白了。

作为一个相关的步骤,我发现了一种在没有发生事情时通知自己的方法。 那个博客在这里。

有很多应用程序以不影响性能的方式执行您正在寻找的内容。 你有没有看过Kibana / ElasticSearch,Splunk或Logscape的企业解决方案(它们都有免费版本)。

我将回应已经说过的内容,并重点介绍java已经提供的内容以及使用外部监控系统可以做些什么。 Java已经提供:

  • log4j – 记录文件的错误,警告,致命错误和例外情况
  • JMX – 创建自定义应用程序指标,您还可以访问java.lang / *,它将为您提供堆内存使用,垃圾收集,线程计数器等。
  • JVM gc logging – 您可以将所有垃圾收集事件记录到文件中,并监视任何长的Full GC集合。

外部监控系统允许您设置不同操作方案触发的警报。 您还可以通过图表获得系统性能的可视化。 我过去使用过Logscape的 java应用程序来监控分布在3个主机上的30个java进程。