天天看點

程式員因重複記錄日志撐爆ELK被辭退!(下)2 配置LevelFilter錯誤

2 配置LevelFilter錯誤

記錄日志到控制台時,将日志按級别記錄到倆檔案

程式員因重複記錄日志撐爆ELK被辭退!(下)2 配置LevelFilter錯誤

執行結果

  • info.log 檔案包含INFO、WARN和ERROR三級日志,不符預期
  • 程式員因重複記錄日志撐爆ELK被辭退!(下)2 配置LevelFilter錯誤
  • error.log包含WARN和ERROR倆級别日志,導緻日志重複收集
  • 程式員因重複記錄日志撐爆ELK被辭退!(下)2 配置LevelFilter錯誤

事故問責

一些公司使用自動化ELK方案收集日志,日志會同時輸出到控制台和檔案,開發人員在本地測試不會關心檔案中記錄的日志,而在測試和生産環境又因為開發人員沒有伺服器通路權限,是以原始日志檔案中的重複問題難以發現。

到底為何重複?

ThresholdFilter源碼解析

  • 日志級别 ≥ 配置級别

    傳回NEUTRAL,繼續調用過濾器鍊上的下個過濾器
  • 否則傳回DENY,直接拒絕記錄日志
  • 程式員因重複記錄日志撐爆ELK被辭退!(下)2 配置LevelFilter錯誤
  • 該案例我們将 ThresholdFilter 置 WARN,是以可記錄WARN和ERROR級日志。

LevelFilter

用于比較日志級别,然後進行相應處理。

若比對就調用onMatch定義的處理方式:預設交給下一個過濾器處理(AbstractMatcherFilter基類中定義的預設值)

否則調用onMismatch定義的處理方式:預設也是交給下一個過濾器

程式員因重複記錄日志撐爆ELK被辭退!(下)2 配置LevelFilter錯誤
程式員因重複記錄日志撐爆ELK被辭退!(下)2 配置LevelFilter錯誤

和ThresholdFilter不同,LevelFilter僅配置level無法真正起作用。

由于未配置onMatch和onMismatch屬性,是以該過濾器失效,導緻INFO以上級别日志都記錄了。

修正

配置LevelFilter的onMatch屬性為ACCEPT,表示接收INFO級别的日志;配置onMismatch屬性為DENY,表示除了INFO級别都不記錄:

程式員因重複記錄日志撐爆ELK被辭退!(下)2 配置LevelFilter錯誤

如此,

_info.log

檔案隻會有INFO級日志,不會再出現日志重複。

繼續閱讀