我想查找或开发可以作为守护程序运行的应用程序,当在主机上运行的Java应用程序会获取任何异常或错误时,通过电子邮件或SMS通知管理员。我知道 JVMTI 可以实现我的一部分目标,但这会影响受监视的应用程序的性能(我不知道它会有多少,如果它很小,可以接受),除了开发JVMTI代理似乎是一项麻烦而且我不确定如果使用同一代理同时运行多个应用程序会发生什么。有更好的解决方案吗?提前致谢。

有帮助吗?

解决方案

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

其他提示

最好的解决方案是让Java应用程序通过电子邮件/SMS发送错误。问题是程序将生成异常并在正常操作中正确处理。您只需要特定异常。

失败了,您可以编写一个日志读取器,该日志读取器读取应用程序的日志。正确做到这一点很棘手,但是可以做到。

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

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

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

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

  • 通过处理日志事件,
  • 通过观看应用程序重新启动,
  • 通过“ pinging”应用程序的Web API来检查服务的LIVISING,并且
  • 通过使用应用程序的JMX接口。

可以以智能方式过滤和优先考虑此信息,并且可以通过最合适的方式报告关键事件。

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

附近有JVMTI的替代方法: JPDA. 。此基础架构使您可以使用Java代码创建一个远程“调试器”(是的,这就是您打算做的),并使用本地或远程连接将其连接到VM。

像JVMTI一样,将有一个开销来执行程序。但是,作为 Trace.java 示例显示,实现并连接到目标VM非常简单。

最后,请注意,如果您想通过应用程序服务器(JBOSS,Glassfish,Tomcat,您将其命名)运行的仪器代码,还有其他各种手段。

我遵循每个例外都记录到表格的模式。然后从该表中选择RSS feed。我在工作中订阅了MS Outlook中的RSS Feed,并在我的Android手机上使用名为Newsrob的程序订阅。 Newsrob让我设置手机,以提醒我新的东西。

我写有关如何做的博客 这里。 它在.NET中,但是您明白了。

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

有很多应用程序可以以不影响性能的方式来完成您寻找的事情。您是否看过Kibana/Elasticsearch,或者是企业解决方案的Splunk或Logscape(它们都有免费版本)。

我将回应已经说了什么,并突出显示了Java已经提供的内容以及您可以使用外部监视系统可以做的事情。 Java已经提供:

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

外部监视系统将允许您设置触发不同操作场景的警报。您还将通过图表可视化系统性能。我用过了 logscape's 过去,Java应用程序监视30个Java流程分布超过3个主机。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top