2 配置LevelFilter錯誤
記錄日志到控制台時,将日志按級别記錄到倆檔案
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CZhNDZ1E2MyATZ3EGZkVWYzYmZ0ITOwIWN5UWZhFWN48CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
執行結果
- 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定義的處理方式:預設也是交給下一個過濾器
和ThresholdFilter不同,LevelFilter僅配置level無法真正起作用。
由于未配置onMatch和onMismatch屬性,是以該過濾器失效,導緻INFO以上級别日志都記錄了。
修正
配置LevelFilter的onMatch屬性為ACCEPT,表示接收INFO級别的日志;配置onMismatch屬性為DENY,表示除了INFO級别都不記錄:
如此,
_info.log
檔案隻會有INFO級日志,不會再出現日志重複。