Log4j,Stat4j,SMTPAppender集成–匯總錯誤日志以發送太多電子郵件

我們的開發團隊希望在生產系統出現問題時盡快得到通知,這是一個每天為成千上萬的客戶提供服務的關鍵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合作伙伴 JakubHoly的 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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374251.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374251.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374251.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C排序算法:(一)直接排序

最簡單的排序方法。 如果從大到小排序&#xff0c;那么從[0]元素開始&#xff0c;和后面的元素進行對比&#xff0c;如果后面元素大&#xff0c;則和[0]元素交換。 核心思想&#xff1a;選定基準元素&#xff0c;和其他元素對比。 #include <stdio.h>unsigned char buff…

數據庫抽象類PDOStatement對象使用

1.預處理語句中使用占位符,分為 索引方式 和 關聯方式 a.索引方式&#xff1a; $pdonew PDO($dns,$username,$password,$options); $sqlselect * from tests where username?,password?; $stmt$pdo->prepare($sql); $stmt->execute(array($username,$password)); b.關聯…

c語言 鏈表_C語言編程第22講——單向有序鏈表的C語言實現

1、單向有序鏈表的含義單向有序鏈表可以解析為四個名詞&#xff1a;表&#xff1a;一組元素&#xff1b;鏈表&#xff1a;表中的元素不是從前往后一個挨著一個&#xff0c;而是通過一個元素才能找到另一個元素&#xff1b;單向&#xff1a;表中的元素只能從前往后訪問&#xff…

Spring 3.1和Hibernate的持久層

1.概述 本文將展示如何使用Spring和Hibernate實現DAO 。 有關核心的Hibernate配置&#xff0c;請參閱有關帶??有Spring的Hibernate 3和Hibernate 4的文章。 2.沒有更多的春天模板 從Spring 3.0和Hibernate 3.0.1開始&#xff0c; 不再需要Spring HibernateTemplate來管理Hib…

C排序算法:(二)冒泡排序

冒泡排序就是從左至右比較相鄰的兩個數值大小&#xff0c;如果右側的數值較小&#xff0c;則交換兩個數值的位置&#xff0c;較大的數值就會像泡泡一樣一路向右漂浮。 #include <stdio.h>//small to big void Bubble_Sort(unsigned char *input_data, unsigned int inpu…

C語言之猜數游戲

#include<stdio.h>#include<stdlib.h>#include<time.h>int main(){ srand(time(0)); int count0,thought; int numrand()%1001; printf("%d\n",num); do { printf("請猜這個數在1-100之間\n"); scanf("%d",&thought); cou…

pythonturtle畫點的指令_簡述python的turtle繪畫命令及解釋

一 基礎認識 turtle庫是python的標準庫之一&#xff0c;它是一個直觀有趣的圖形繪制數據庫&#xff0c;turtle(海龜&#xff09;圖形繪制的概念誕生1969年。它的應用十分廣&#xff0c;而且使用簡單&#xff0c;只要在編寫python程序時寫上import turtle即可。 1.繪圖窗口設置命…

算法—振興中華(C語言版)

/* 標題: 振興中華小明參加了學校的趣味運動會&#xff0c;其中的一個項目是&#xff1a;跳格子。地上畫著一些格子&#xff0c;每個格子里寫一個字&#xff0c;如下所示&#xff1a;從我做起振我做起振興做起振興中起振興中華比賽時&#xff0c;先站在左上角的寫著“從”字的格…

OpenGL ES一些函數詳解(一)

glLoadIdentity和glMultMatrix glLoadIdentity的作用是將當前模型視圖矩陣轉換為單位矩陣&#xff08;行數和列數相同的矩陣&#xff0c;并且矩陣的左上角至右下角的連線上的元素都為1&#xff0c;其它元素都為0&#xff09;&#xff0c;這樣可以方便矩陣的乘法運算。 glMultMa…

忽略Java中的自簽名證書

我在職業生涯中遇到過幾次問題&#xff0c;就是我們有時希望允許自簽名證書用于開發或測試目的。 Google的快速搜索顯示了多年來無數Java開發人員遇到的麻煩。 根據確切的證書問題&#xff0c;您可能會收到類似以下內容之一的錯誤&#xff0c;盡管我幾乎肯定有其他表現形式&…

C排序算法:(三)插入排序

像打撲克牌一樣&#xff0c;每次摸一張牌&#xff0c;把牌插入正確位置。 #include <stdio.h>void Insert_Sort_Small_To_Big(unsigned char* input_data, unsigned int input_length) {int i 0, j 0;unsigned char temp 0;for (i 1; i < input_length; i){temp …

sqlserver中自定義函數+存儲過程實現批量刪除

由于項目的需要&#xff0c;很多模塊都要實現批量刪除的功能。為了方便模塊的調用&#xff0c;把批量刪除方法寫成自定義函數。直接上代碼。 自定義函數&#xff1a; ALTER FUNCTION [dbo].[func_SplitById] (str varchar(50),split varchar(10))--傳過來的id字符串 --分割的標…

c語言選擇排序_C語言——選擇排序

1 選擇排序&#xff08;5分&#xff09;題目內容&#xff1a;編寫選擇排序&#xff0c;要求排序過程調用函數實現&#xff0c;在主函數輸入n個數據&#xff0c;調用函數后&#xff0c;輸出排好序的元素輸入格式:輸入整型數n&#xff0c;并輸入n個整數&#xff0c;輸入數據用空格…

算法—巧排撲克牌(C語言)

/*小明剛上小學&#xff0c;學會了第一個撲克牌“魔術”&#xff0c;到處給人表演。魔術的內容是這樣的&#xff1a;他手里握著一疊撲克牌&#xff1a;A&#xff0c;2&#xff0c;....J&#xff0c;Q&#xff0c;K 一共13張。他先自己精心設計它們的順序&#xff0c;然后正面朝…

LeetCode Binary Tree Paths(簡單題)

題意&#xff1a;   給出一個二叉樹&#xff0c;輸出根到所有葉子節點的路徑。 思路&#xff1a; 直接DFS一次&#xff0c;只需要判斷是否到達了葉子&#xff0c;是就收集答案。 1 /**2 * Definition for a binary tree node.3 * struct TreeNode {4 * int val;5 * …

我的測試和代碼分析工具箱

上周&#xff0c;我們在LINEAS成立了一個“測試技能小組”&#xff0c;該小組用于交換有關測試的知識。 各種各樣的問題反復出現的一個問題是&#xff1a;有哪些工具可以測試和分析您的代碼&#xff1f; 因此&#xff0c;這是我對此的個人回答&#xff0c;按照我傾向于將其介紹…

新唐M0 KEIL環境搭建,找不到device不識別,關鍵:Nu-Link_Keil_Driver

公司用新唐的芯片&#xff0c;網上關于新唐的資料相對ST確實少得可憐&#xff0c;搭建環境也是搞了好久&#xff0c;去keil官網下載安裝了新唐的pack 打開官方參考工程還是提示找不到device&#xff0c;option里面也沒有識別出來。 百度了好久&#xff0c;嘗試了各種辦法&…

c語言有趣代碼_【新課預知】——C語言程序設計

編者按&#xff1a;如今疫情這么嚴重&#xff0c;為了保護好自己&#xff0c;為了身邊的人&#xff0c;大家可一定要聽從國家號召——“宅”起來&#xff01;并且&#xff0c;小編們為了讓大家伙“宅”得更加健康&#xff0c;可是費了不少腦筋呢&#xff0c;學哉數理公眾號首次…

用R語言的quantreg包進行分位數回歸

什么是分位數回歸 分位數回歸(Quantile Regression)是計量經濟學的研究前沿方向之一&#xff0c;它利用解釋變量的多個分位數&#xff08;例如四分位、十分位、百分位等&#xff09;來得到被解釋變量的條件分布的相應的分位數方程。 與傳統的OLS只得到均值方程相比&#xff0c;…

算法—快速排序Sqrt (C語言)

/* 快速排序 */ #include"stdio.h" #include"stdlib.h" int compare(const void* a,const void* b) {return (*(int *)a-*(int *)b); }int main() {int i,a[]{32,29,59,8,22,68,89,77},n;nsizeof(a)/sizeof(a[0]);printf("排序前:\n");for(i0;i&…