我们的开发团队希望在生产系统出现问题时尽快得到通知,这是一个每天为成千上万的客户提供服务的关键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发送错误,我们对不太严重的异常不感兴趣
  • #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

Log4j,Stat4j,SMTPAppender集成–汇总错误日志以发送太多电子邮件相关推荐

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

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

  2. nextjs 错误日志收集

    最近用nextjs开发一款房产渠道管理的系统,从开始的项目管理,到价格单管理.订单管理.团队管理.中介管理.个人信息管理...等等功能越来越多的时候,前端偶现的问题不容易发现,造成了不必要的麻烦,就想 ...

  3. log4j中调试与错误日志分开_Log4j 配置

    我们可以通过设置Log Level,定义Appender和在配置文件中指定Layout对象来配置log4j. log4j.properties 文件是一个log4j配置文件,它保留键 - 值对中的属性 ...

  4. mongodb java 日志分析_记一次log4j与mongodb集成引发的问题分析

    问题背景 对项目中的关键应用调用链日志需要结构化得统一吐出到mongodb中,同时项目中日志输出使用log4j,故准备使用log4j的Appender直接集成mongodb的输出,同时mongodb采 ...

  5. 在Java项目中打印错误日志的正确姿势,排查问题更方便,非常实用!

    作者:琴水玉 cnblogs.com/lovesqcc/p/4319594.html 在程序中打错误日志的主要目标是为更好地排查问题和解决问题提供重要线索和指导.但是在实际中打的错误日志内容和格式变化 ...

  6. log4j2_使用log4j监视和筛选应用程序日志到邮件

    log4j2 在今天的帖子中,我将向您展示如何将日志语句过滤为警告电子邮件. 这是出于监视我正在处理的一个应用程序的几个关键点的需要. 您可以使用一些工具来执行应用程序监视. 我没有详细介绍这些工具, ...

  7. Spring Boot 入门(五):集成 AOP 进行日志管理

    本篇文章是接着 Spring boot 入门(四):集成 Shiro 实现登陆认证和权限管理写的,按照前面几篇博客的教程,可以搭建一个简单的项目,主要包含了 Pagehelper+MyBatis 分页 ...

  8. log4j 程序日志_使用log4j监视和筛选应用程序日志到邮件

    log4j 程序日志 在今天的帖子中,我将向您展示如何将日志语句过滤为警告电子邮件. 这是出于监视我正在处理的一个应用程序的一些关键点的需要. 您可以使用一些工具来执行应用程序监视. 我不会详细介绍这 ...

  9. 使用log4j监视和筛选应用程序日志到邮件

    在今天的帖子中,我将向您展示如何将日志语句过滤为警告电子邮件. 这是出于监视我正在处理的一个应用程序的一些关键点的需要. 您可以使用一些工具来执行应用程序监视. 我不会详细介绍这些工具,但有时让应用程 ...

最新文章

  1. Httprunner测试
  2. 图解Nosql(hbase)与传统数据库的区别
  3. 64位windows 7下成功配置TortoiseGit使用Github服务器
  4. public medical image database
  5. 关于Oracle回收站的一些操作
  6. 万字长文 - 解读功能开关 | IDCF
  7. php网站无法显示,php – 在UTF-8网站上无法正确显示的字符
  8. 【Rényi差分隐私和零集中差分隐私(差分隐私变体)代码实现】差分隐私代码实现系列(九)
  9. 用 canal 监控 binlog 并实现mysql定制同步数据的功能
  10. matlab 启动图标
  11. linux环境下tomcat启动成功,部分请求页面出现404
  12. vs code 的常用快捷键列表
  13. 我们是如何认识这个世界的呢
  14. vue中使用loadsh实现防抖功能及处理各种数据
  15. Eclipse Neno.3 + Jrebel 7.0.9 图文在线安装
  16. 判断手机音量大小,做出提醒
  17. 程序员如何求职找工作?这样分析就对了!
  18. 客服对于Kindle电子书的退货、倒闭、VR等问题的回答
  19. 智能电话机器人(AI语音机器人)时什么?
  20. Linux 查看内核以及系统版本的3种方法

热门文章

  1. java泛型程序设计——类型变量限定 + 泛型代码和虚拟机
  2. 以Linux系统(Ubuntu)开发生活(一)
  3. activiti异步执行_对基于消息队列的Activiti异步执行器进行基准测试
  4. 游戏 服务器 微服务_整体服务器与微服务
  5. java se 导原码_Java SE 8新功能导览:Java开发世界中的重大变化
  6. Spring Boot CommandLineRunner和ApplicationRunner
  7. Arrays.hashCode(Object [])与Objects.hash(Object…)
  8. tms tck_两个用于Eclipse的TCK –开源到底有什么?
  9. 部署Spring Boot Angular App(Maven和Tomcat)的4种方法
  10. Java命令行界面(第5部分):JewelCli