什么是通知管理员有关Java应用程序的新异常的最佳方法?

Jac*_*ack 10 java exception-handling struts2 jms java-ee

我的问题是,最好的方法是跟踪应用程序管理员的异常.(出于维护目的,通知管理员抛出的异常).

对于系统用户,我认为应该捕获异常并显示相应的错误消息. 我认为,对于系统管理员来说,最好的方法是让消息系统将每个异常的详细信息作为消息发送给接收方.一旦接收方收到新的错误消息,它就会在数据库中持续显示,或者向管理员发送一封包含异常详细信息的电子邮件.

try{
  ....
}
catch(Exception e){
   //what to do here? how to notify admin?
}
Run Code Online (Sandbox Code Playgroud)

Kea*_*eks 10

我建议使用log4j,配置SMTPAppender监听致命日志.然后,只需记录到达全局try/catch块的任何未处理异常的致命级别消息(包含您可以获得的任何有用信息).

另请参阅:在log4j中配置SMTPAppender的正确方法是什么?


Ale*_*tos 9

企业方案:

使用SL4J并将所有邮件保存到日志中.

使用MDC将标记添加到日志消息中.让这些标签描述应该通知谁以及错误的性质:

2014-05-24 [SystemCAD][NOTIFY=ADMIN], [ACCOUNTID=123], [SEVERITY=SEVERE], [MESSAGE="Cannot contact Google.com"]  
2014-05-24 [SystemCAD][NOTIFY=USER], [ACCOUNTID=123], [SEVERITY=SEVERE], [MESSAGE="Could not save document to Google. Support has been notified."]  
Run Code Online (Sandbox Code Playgroud)

获取Splunk或类似于索引所有日志的产品,以便于搜索和创建可用于通知管理员的事件.使用PagerDutty通知您的管理员并创建升级,避免重复,创建触发器等.

  • 对于非常小的系统来说,它是一个很好的解决方案,但是只要你的日志开始增长,你就需要考虑索引它们并进行搜索.这就是Splunk提供的.另一个问题是管理员想要配置通知传递.例如,如果是营业时间,请给我发电子邮件,但如果是在下班后,请给我发短信.或者,如果我正在度假......而且您根本无法要求SMTPAppender提供所需的所有灵活性.这就是你需要PagerDutty的原因. (2认同)

Ste*_*n C 6

首先,不要尝试解决应用程序本身的通知问题.

建议的方法是在应用程序中的适当位置捕获异常,并生成捕获故障详细信息(包括异常)的日志事件.主要日志记录应使用标准日志记录系统完成.有许多可行的方案(例如java.util.logging,log4j,logback,log4j2,slf4j),每个职业的和反对的,但最重要的是不要试图"滚你自己".

这很容易.

困难的部分是弄清楚如何以适当的方式从日志系统获取通知给管理员.有许多事情需要考虑:

  • 管理员不会在凌晨2点被一个报告办公室水冷却器温度过高的页面唤醒.

  • 管理员不希望50条短信都报告同样的问题.系统需要能够过滤掉重复的内容.

  • 管理员需要能够告诉系统"关闭"某个问题/问题.

  • 系统需要认识到某些事件比其他事件更重要,而营业时间与下班后事件会影响优先级.

  • 通知管理员的最合适方式是什么?电子邮件?短信?寻呼机?

  • 升级 - 如果主要(待命)管理员没有响应通知怎么办?

  • 该系统还需要与其他监测相结合; 例如,检查服务可用性,网络连接,文件系统级别,CPU /负载平均度量,检查重要事件是否发生.

  • 所有这些都需要是可配置的,与首先生成事件的应用程序无关.

  • 理想情况下,您需要与运营问题跟踪系统集成...以帮助管理员将事件与先前的问题相关联等.

这是一个非常大的问题空间.幸运的是,那里有产品可以做这种事情. 这里列出的太多了.

(IMO,为您推荐一个解决方案是没有意义的.我们不了解您组织的要求.这需要与运营人员和管理层一起进行整理.)


Sur*_*aju 5

我已经使用Spring AOP在应用程序中完成了关于异常的通知。

例如

@Aspect
public class ExceptionAspect {

   @AfterThrowing(
      pointcut = "execution(* com.suren.customer.bo.CustomerBo.addCustomerThrowException(..))",
      throwing= "error")
    public void logAfterThrowing(JoinPoint joinPoint, Throwable error) {
    // Notify admin in email
    sendEmail(joinPoint,error);

    }
}
Run Code Online (Sandbox Code Playgroud)

常见的AspectJ注释:

@Before – Run before the method execution
@After – Run after the method returned a result
@AfterReturning – Run after the method returned a result, intercept the returned result as well.
@AfterThrowing – Run after the method throws an exception
@Around – Run around the method execution, combine all three advices above.
Run Code Online (Sandbox Code Playgroud)