Log4j,Stat4j,SMTPAppender集成–汇总错误日志以发送太多电子邮件
在本文中,我想介紹一個(gè)簡(jiǎn)單的解決方案,我們已經(jīng)使用基于Stats4j和SMTPAppender的自定義Log4J Appender實(shí)現(xiàn)了(這比您預(yù)期的配置和故障排除更加困難)。
挑戰(zhàn)
我們?cè)谌罩痉矫婷媾R以下挑戰(zhàn):
- 不幸的是,有一定數(shù)量的例外情況是正常的(客戶選擇沒(méi)有結(jié)果的搜索條件,外部服務(wù)的暫時(shí)性,不重要的中斷等),因此我們當(dāng)然不希望被發(fā)送垃圾郵件。 因此,解決方案必須具有可配置的閾值,并且僅在超出閾值時(shí)發(fā)送警報(bào)。
- 故障率應(yīng)該在可配置的時(shí)間內(nèi)進(jìn)行計(jì)算(足夠長(zhǎng)的時(shí)間不會(huì)因幾分鐘的中斷而觸發(fā)警報(bào),而足夠短的時(shí)間可以在發(fā)生嚴(yán)重事件時(shí)盡快通知團(tuán)隊(duì))。
- 發(fā)送警報(bào)后,一段時(shí)間內(nèi)(最好在解決原始問(wèn)題之前)不應(yīng)再發(fā)送其他警報(bào),我們不希望因?yàn)槲覀円呀?jīng)知道的問(wèn)題而被發(fā)送垃圾郵件。
解決方案
我們基于Lara D'Abreo的Stat4J解決方案,該解決方案提供了一個(gè)自定義Log4J附加程序,該附加程序使用日志來(lái)計(jì)算可配置的度量,并在超出警告或嚴(yán)重閾值時(shí)觸發(fā)警報(bào)。 它有幾年歷史了,具有alpha質(zhì)量(關(guān)于通用性和靈活性)的開(kāi)源庫(kù),幸運(yùn)的是,它足夠簡(jiǎn)單,可以輕松地根據(jù)需要進(jìn)行修改。
因此,我們對(duì)Stat4J進(jìn)行了調(diào)整,以在警報(bào)數(shù)量超過(guò)閾值時(shí)生成警報(bào),此后保持安靜,然后將其與Log4J SMTPAppender結(jié)合使用, 后者偵聽(tīng)警報(bào)并將其通過(guò)電子郵件發(fā)送給團(tuán)隊(duì)。
Stat4J調(diào)整
Stat4J的關(guān)鍵組件包括用于Log4J的Stat4jAppender,用于匯總單個(gè)日志的計(jì)算器(度量)(例如,通過(guò)對(duì)它們進(jìn)行計(jì)數(shù)或從中提取一些數(shù)字),用于定義要通過(guò)正則表達(dá)式考慮的日志以及如何通過(guò)以下方式處理的統(tǒng)計(jì)信息:引用計(jì)算器,最后在統(tǒng)計(jì)信息的值超出其限制時(shí)發(fā)出警告,并記錄警告。 您可以在介紹Stat4J的文章中了解更多信息 。
我們已經(jīng)實(shí)現(xiàn)了一個(gè)自定義的度量計(jì)算器, RunningRate (以計(jì)算最近N分鐘內(nèi)的失敗數(shù)),并修改了Stat4J,如下所示:
- 我們?cè)鰪?qiáng)了Alert來(lái)支持新屬性quietperiod,以便一旦觸發(fā),隨后的警報(bào)將在該持續(xù)時(shí)間內(nèi)被忽略(除非以前的警報(bào)只是警告,而新警報(bào)是關(guān)鍵警報(bào))
- 我們修改了附加器, 將日志的Throwable與日志消息一起包含,然后將其傳遞給各個(gè)統(tǒng)計(jì)計(jì)算器,以便我們可以更精確地過(guò)濾要計(jì)數(shù)的內(nèi)容
- 最后,我們修改了Alert,將警報(bào)記錄為錯(cuò)誤而不是警告,以使SMTPAppender不會(huì)忽略它們
從GitHub (我們的源代碼或編譯的jar )中獲取我們修改后的Stat4j 。 免責(zé)聲明:這是一天的工作,我對(duì)代碼并不感到驕傲。
Stat4J配置
以stat4j.properties為例 ,并將其放在類路徑中。 它已經(jīng)配置了正確的計(jì)算器,統(tǒng)計(jì)信息和警報(bào)。 看到這部分:
### 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重要的配置參數(shù)是
- Calculator.minuteRate.period (以毫秒為單位)–在此期間計(jì)算錯(cuò)誤,在其結(jié)束時(shí)重置計(jì)數(shù); 合理的值可能是10分鐘
- alert.TooManyErrorsRecently.warn和alert.TooManyErrorsRecently.critical –在此期間遇到如此多的錯(cuò)誤時(shí)觸發(fā)警報(bào)。 合理的值取決于您應(yīng)用程序的正常錯(cuò)誤率
- alert.TooManyErrorsRecently.quietperiod (以毫秒為單位)–在此期間,在持續(xù)失敗的情況下,不要發(fā)送進(jìn)一步的警報(bào)以防止垃圾郵件; 合理的值取決于您通常解決問(wèn)題的速度,對(duì)我來(lái)說(shuō)1個(gè)小時(shí)似乎還可以
Log4J配置
現(xiàn)在,我們需要告訴Log4J使用Stat4j附加程序來(lái)計(jì)算錯(cuò)誤發(fā)生次數(shù)并通過(guò)電子郵件發(fā)送警報(bào):
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發(fā)送錯(cuò)誤,我們對(duì)不太嚴(yán)重的異常不感興趣
- #14“警報(bào)”是Stat4jAppender用于記錄警報(bào)的日志類別(與您通過(guò)Logger.getLogger(“ alerts”)創(chuàng)建的類別)相同; 如前所述,SMTPAppender將不考慮配置而僅處理錯(cuò)誤和更高級(jí)別
SMTPAppender的問(wèn)題
使SMTPAppender工作非常棘手。 一些陷阱:
- SMTPAppender忽略所有非ERROR或更高級(jí)別的日志,而不考慮您如何設(shè)置閾值
- 如果您指定了“不存在的發(fā)件人”域,則某些收件人的郵件服務(wù)器可以將其作為垃圾郵件刪除(例如,GMail)
- 要發(fā)送電子郵件,您當(dāng)然需要mail.jar(對(duì)于舊版JVM也需要activation.jar),這是Tomcat的說(shuō)明。
一個(gè)$ 100的提示:要對(duì)其進(jìn)行調(diào)試,請(qǐng)?jiān)谡{(diào)試模式下運(yùn)行您的應(yīng)用程序,并在javax.mail.Transport#send上設(shè)置方法斷點(diǎn)(不需要源代碼),然后在其中設(shè)置this.session.debug為如果為true,則會(huì)在服務(wù)器日志中獲得以下SMTP通信的非常詳細(xì)的日志。
邊注
本文基于Log4J的事實(shí)并不意味著我會(huì)親自選擇它,它只是隨項(xiàng)目一起提供的。 我至少會(huì)考慮使用更新的和閃亮的Logback代替:-)。
結(jié)論
Stat4j + SMTPAppender是基于日志和電子郵件的相當(dāng)靈活的自行完成警報(bào)系統(tǒng)的良好基礎(chǔ)。 您可以使用Hyperic HQ plus開(kāi)箱即用地實(shí)現(xiàn)相同的功能。
參考: 當(dāng)錯(cuò)誤日志太多時(shí),聚集錯(cuò)誤日志以發(fā)送警告電子郵件–來(lái)自The Holy Java Blog的 JCG合作伙伴 JakubHoly的 Log4j,Stat4j,SMTPAppender 。
相關(guān)文章 :- 首先記錄異常的根本原因
- Java日志混亂
- 正確記錄應(yīng)用程序的10個(gè)技巧
- 使用Java發(fā)送電子郵件
- Spring,Quartz和JavaMail集成教程
- 使用Spring使用Java發(fā)送電子郵件– GMail SMTP服務(wù)器示例
- Java教程和Android教程列表
翻譯自: https://www.javacodegeeks.com/2011/10/log4j-stat4j-smtpappender-integration.html
總結(jié)
以上是生活随笔為你收集整理的Log4j,Stat4j,SMTPAppender集成–汇总错误日志以发送太多电子邮件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 希沃白板5怎么做课件希沃5电子白板使用教
- 下一篇: 我的测试和代码分析工具箱