_stat64获取错误

我们的开发团队希望在生产系统出现问题时尽快得到通知,这是一个每天为成千上万的客户提供服务的关键Java Web应用程序。 想法是让它在出现太多错误时向我们发送电子邮件,这些错误通常表示数据库,外部Web服务有问题,或者应用程序本身确实存在问题。

在本文中,我想介绍一个简单的解决方案,我们已经使用基于Stats4j和SMTPAppender的自定义Log4J Appender实现了(这比您预期的配置和故障排除更加困难)。

挑战

我们在日志方面面临以下挑战:

  • 不幸的是,有一定数量的例外情况是正常的(客户选择没有结果的搜索条件,外部服务的暂时性,不重要的中断等),因此我们当然不希望被发送垃圾邮件。 因此,解决方案必须具有可配置的阈值,并且仅在超出阈值时发送警报。
  • 故障率应在可配置的时间内进行计算(由于几分钟的中断而导致的故障时间足够长,不会触发警报,而在发生严重事件时,也要足够短的时间使团队尽快得到通知)。
  • 发送警报后,一段时间内(最好在解决原始问题之前)不应再发送其他警报,我们不想因为已经知道的问题而被发送垃圾邮件。

解决方案

我们基于Lara D'Abreo的Stat4J解决方案,该解决方案提供了一个自定义Log4J附加程序,该附加程序使用日志来计算可配置的度量,并在超出警告或严重阈值时触发警报。 它有几年历史了,具有alpha质量(关于通用性和灵活性)的开源库,幸运的是,它足够简单,可以轻松修改以适应自己的需求。

因此,我们对Stat4J进行了调整,以在警报数量超过阈值时生成警报,此后保持安静,然后将其与Log4J SMTPAppender结合使用, 后者侦听警报并将其通过电子邮件发送给团队。

Stat4J调整

Stat4J的关键组件包括用于Log4J的Stat4jAppender,用于汇总单个日志的计算器(度量)(例如,通过对它们进行计数或从中提取一些数字),用于定义要通过正则表达式考虑的日志以及如何处理它们的统计信息。引用计算器,并最终在统计信息的值超出其限制时发出警报并记录警告。 您可以在介绍Stat4J的文章中了解更多信息 。

我们已经实现了一个自定义的度量计算器, RunningRate (以计算最近N分钟内的失败数),并修改了Stat4J,如下所示:

  • 我们增强了Alert,以支持新属性quietperiod,以便一旦触发,随后的警报将在该持续时间内被忽略(除非以前的警报只是警告,而新警报是关键警报)
  • 我们修改了附加器, 将日志的Throwable与日志消息一起包含,然后将其传递给各个统计计算器,以便我们可以更精确地过滤要计数的内容
  • 最后,我们修改了Alert,将警报记录为错误而不是警告,以使SMTPAppender不会忽略它们

从GitHub (我们的源代码或编译的jar )中获取我们修改后的Stat4j 。 免责声明:这是一天的工作,我对代码并不感到骄傲。

Stat4J配置

以stat4j.properties为例 ,将其放在类路径中。 它已经配置了正确的计算器,统计信息和警报。 看到这一部分:

### JAKUB HOLY - MY CONFIG
calculator.minuteRate.classname=net.sourceforge.stat4j.calculators.RunningRate
# Period is in [ms] 1000 * 60 * 10 = 10 min:
calculator.minuteRate.period=600000statistic.RunningErrorRate.description=Errors per 10 minutes
statistic.RunningErrorRate.calculator=minuteRate
# Regular expression to match "<throwable.toString> <- <original log message>"
statistic.RunningErrorRate.first.match=.*Exception.*# Error Rate
alert.TooManyErrorsRecently.description=Too many errors in the log
alert.TooManyErrorsRecently.statistic=RunningErrorRate
alert.TooManyErrorsRecently.warn= >=3
alert.TooManyErrorsRecently.critical= >=10
alert.TooManyErrorsRecently.category=alerts
# Ignore following warnings (or criticals, after the first critical) for the given amount of time:
# 1000 * 60 * 100 = 100 min
alert.TooManyErrorsRecently.quietperiod=6000000

重要的配置参数是

  • Calculator.minuteRate.period (以毫秒为单位)–在此期间计算错误,在其结束时重置计数; 合理的值可能是10分钟
  • alert.TooManyErrorsRecently.warnalert.TooManyErrorsRecently.critical –在此期间遇到太多错误时触发警报; 合理的值取决于您的应用程序的正常错误率
  • alert.TooManyErrorsRecently.quietperiod (以毫秒为单位)–在此期间,在持续失败的情况下,请勿发送进一步的警报以防止垃圾邮件; 合理的值取决于您通常解决问题的速度,对我来说1个小时似乎还可以

Log4J配置

现在,我们需要告诉Log4J使用Stat4j附加程序来计算错误发生次数并通过电子邮件发送警报:

log4j.rootCategory=DEBUG, Console, FileAppender, Stat4jAppender
...
### Stat4jAppender & EmailAlertsAppender ###
# Collects statistics about logs and sends alerts when there
# were too many failures in cooperation with the EmailAlertsAppender## Stat4jAppender
log4j.appender.Stat4jAppender=net.sourceforge.stat4j.log4j.Stat4jAppender
log4j.appender.Stat4jAppender.Threshold=ERROR
# For configuration see stat4j.properties## EmailAlertsAppender
# BEWARE: SMTPAppender ignores its Thresholds and only evers sends ERROR or higher messages
log4j.category.alerts=ERROR, EmailAlertsAppender
log4j.appender.EmailAlertsAppender=org.apache.log4j.net.SMTPAppender
log4j.appender.EmailAlertsAppender.To=dummy@example.com
# BEWARE: The address below must have a valid domain or some receivers will reject it (e.g. GMail)
log4j.appender.EmailAlertsAppender.From=noreply-stat4j@google.no
log4j.appender.EmailAlertsAppender.SMTPHost=172.20.20.70
log4j.appender.EmailAlertsAppender.BufferSize=1
log4j.appender.EmailAlertsAppender.Subject=[Stat4j] Too many exceptions in log
log4j.appender.EmailAlertsAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.EmailAlertsAppender.layout.ConversionPattern=%d{ISO8601} %-5p %X{clientIdentifier} %c %x - %m%n

注释

  • #8指定Stat4J附加程序
  • #9仅向Stat4J发送ERROR,我们对不太严重的异常不感兴趣
  • #14“警报”是Stat4jAppender用于记录警报的日志类别(与您通过Logger.getLogger(“ alerts”)创建的类别)相同; 如前所述,SMTPAppender将不考虑配置而仅处理错误和更高级别的错误

SMTPAppender的问题

使SMTPAppender工作非常棘手。 一些陷阱:

  • SMTPAppender忽略所有非ERROR或更高级别的日志,而不考虑您如何设置阈值
  • 如果您指定不存在的“发件人”域,则某些收件人的邮件服务器可以将其删除为垃圾邮件(例如GMail)
  • 要发送电子邮件,您当然需要mail.jar(对于较早的JVM,还需要activation.jar),这是Tomcat的说明。

还有一个100美元的提示:要对其进行调试,请在调试模式下运行您的应用程序,并在javax.mail.Transport#send(不需要源代码)上设置方法断点,然后在该位置将this.session.debug设置为如果为true,则会在服务器日志中获得以下SMTP通信的非常详细的日志。

边注

本文基于Log4J的事实并不意味着我会亲自选择它,而是随项目一起提供的。 我至少会考虑使用更新的和闪亮的Logback代替:-)。

结论

Stat4j + SMTPAppender是基于日志和电子邮件的相当灵活的自行执行警报系统的良好基础。 您可以使用Hyperic HQ plus开箱即用地实现相同的功能。

参考: 当错误日志太多时,聚集错误日志以发送警告电子邮件–来自The Holy Java Blog的 JCG合作伙伴 JakubHolý的 Log4j,Stat4j,SMTPAppender 。

相关文章 :
  • 首先记录异常的根本原因
  • Java日志混乱
  • 正确记录应用程序的10个技巧
  • 使用Java发送电子邮件
  • Spring,Quartz和JavaMail集成教程
  • 使用Spring使用Java发送电子邮件– GMail SMTP服务器示例
  • Java教程和Android教程列表

翻译自: https://www.javacodegeeks.com/2011/10/log4j-stat4j-smtpappender-integration.html

_stat64获取错误

_stat64获取错误_Log4j,Stat4j,SMTPAppender集成–汇总错误日志以发送过多电子邮件...相关推荐

  1. Log4j,Stat4j,SMTPAppender集成–汇总错误日志以发送太多电子邮件

    我们的开发团队希望在生产系统出现问题时尽快得到通知,这是一个每天为成千上万的客户提供服务的关键Java Web应用程序. 这个想法是让它在出现太多错误时向我们发送电子邮件,这些错误通常表明数据库,外部 ...

  2. 微信JS-SDK之地理位置的获取与在线导航,集成百度地图实现在线地图搜索

    原创声明:本文来源于本人另一博客[微信JS-SDK之地理位置的获取,集成百度地图实现在线地图搜索]原创作品,绝非他处摘取,转载请联系博主 本次讲解微信开发第三篇:获取用户地址位置信息,是非常常用的功能 ...

  3. 恋与制作人 服务器错误,恋与制作人常见问题汇总

    <恋与制作人>网络不稳定怎么办? 有小伙伴在恋与制作人中遇到了网络不稳定的情况,那么恋与制作人网络不稳定怎么办?怎么解决?下面玩游小编就为大家带来恋与制作人网络不稳定解决方法介绍~> ...

  4. 获取this_小程序获取微信运动步数并集成echarts报表显示

    需求 现在运动计步非常的火,大家常用的计步工具一般有keep.咕咚.微信运动和其他移动设备等,本文是基于微信小程序获取用户的微信运动数据并可视化呈现出来. 先看一下最终实现效果: 微信运动规则 在开发 ...

  5. oracle如何获取异常,Oracle专题13之异常错误处理

    异常:是程序在正常执行过程中发生的未预料的事件. b.什么是异常处理? 异常处理是为了提高程序的健壮性,使用异常处理部分可以有效地解决程序正常执行过程中可能出现的各种错误,使得程序正常运行. c.异常 ...

  6. 小程序获取微信运动步数并集成echarts报表显示

    需求 现在运动计步非常的火,大家常用的计步工具一般有keep.咕咚.微信运动和其他移动设备等,本文是基于微信小程序获取用户的微信运动数据并可视化呈现出来. 先看一下最终实现效果: 微信运动规则 在开发 ...

  7. Go: go mod获取第三方依赖包unknown revision xxx错误解决

    Go: go mod获取第三方依赖包unknown revision xxx错误解决 使用go mod处理第三方依赖包时出现unknown revision xxx错误,解决方法如下: 以go-cha ...

  8. 关于BaiduPCS-Go不能用问题解决,报错【获取目录下的文件列表 遇到错误, 远端服务器返回错误】

           BaiduPCS-Go不能使用报错:获取目录下的文件列表 遇到错误, 远端服务器返回错误, 代码: 4, 消息: No permissionto do this operation, 路 ...

  9. 计算机组装常见问题,组装电脑常见错误有哪些 组装电脑常见错误汇总【详细介绍】...

    今天主要讨论一些组装电脑基础的内容,那些高端MOD毕竟只是小众群体.DIY组装电脑,简单说来就是把一堆硬件拼凑,组成一个完整的主机.而组装电脑其中,处理器. 板卡.内存等都是不太容出现问题的.一是由于 ...

最新文章

  1. 基于tensorflow的MNIST手写字识别
  2. 【AutoML】强化学习如何用于自动模型设计(NAS)与优化?
  3. Deeplearning.ai深度学习课程笔记-在线版
  4. 【桶排】小 X 的密码破译
  5. Android 文件的上传
  6. java并发AtomicReference
  7. SAP License:PS中比较常用的事务代码
  8. python ssh模块_python ssh之paramiko模块使用
  9. 好用的Java开发IDEA插件汇总推荐
  10. 软件需求分析----实验室设备管理系统
  11. AnimeGAN v2:动漫风格化GAN
  12. NRF52832 SPI 资料收集
  13. 深度分析红米note9和华为nova8哪个好-红米note9和华为nova8区别
  14. 【技巧】Excel序号设置自动更新
  15. 使用 IDEA 翻译插件
  16. YoMail 隐藏小功能之怎样在yomail里使用石墨文档?
  17. Maven项目缺少Maven Dependencies新的解决方法
  18. ClassLoader加载类时序图及Qzon修复流程图
  19. windows7蓝牙怎么打开_英特尔升级WiFi 和蓝牙驱动,Win10 更新5月版稳了
  20. Display port

热门文章

  1. Mysql常用语法总结
  2. Git GitHub Gitee GitLab
  3. mysql 时间 1_(转)mysql日期时间函数1
  4. echarts line 去掉最外围方框_干货 | 关于射频芯片最详细解读
  5. javah导出类的头文件抛出异常——java.lang.IllegalArgumentException: Not a valid class name(原因及解决方法)
  6. restful rest_HATEOAS的RESTful服务。 超媒体:REST的秘密要素
  7. pivotal_Spring Data Pivotal Gemfire教程
  8. 混合多云架构_混合多云每个人都应避免的3个陷阱(第1部分)
  9. java登录界面命令_Java命令行界面(第13部分):JArgs
  10. vert.x 分布式锁_使用Vert.x进行响应式开发