0

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

4

6 回答 6

1

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

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

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

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

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

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

于 2010-12-17T10:43:17.373 回答
1

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

于 2010-12-17T09:17:56.670 回答
1

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

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

一个应用程序每天可以生成 1000 多个异常并且仍然​​正常运行,因为应用程序知道如何处理这些异常。例如,每次关闭套接字连接时都会引发异常。

于 2010-12-17T09:19:33.903 回答
0

有很多应用程序可以以不影响性能的方式完成您正在寻找的工作。您是否看过用于企业解决方案的 Kibana/ElasticSearch、Splunk 或 Logscape(它们都有免费版本)。

我将重复已经说过的内容,并强调 java 已经提供了什么以及您可以使用外部监控系统做什么。Java 已经提供:

  • log4j - 将错误、警告、致命和异常记录到文件中
  • JMX - 创建自定义应用程序指标,您还可以访问 java.lang/*,这将为您提供堆内存使用、垃圾收集、线程计数器等。
  • JVM gc 日志记录 - 您可以将所有垃圾收集事件记录到一个文件中,并监视任何长时间的 Full GC 收集。

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

于 2013-11-29T11:40:45.630 回答
0

我遵循将每个异常记录到表中的模式。然后从该表中选择一个 RSS 提要。我在工作中订阅了 MS Outlook 中的 RSS 提要,也在我的 Android 手机上订阅了一个名为 NewsRob 的程序。NewsRob 让我将手机设置为在有新消息时提醒我。

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

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

于 2011-01-08T01:20:35.710 回答
0

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

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

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

于 2010-12-17T09:20:54.143 回答