惰性日志
點擊上方“朱小廝的博客”,選擇“設為星標”
做積極的人,而不是積極廢人
來源:itnext.io/lazy-logging-40314cf9bb25
在代碼中添加日志時要當心:有時盡管并沒有記錄日志,也會執行日志語句。例如下面的代碼:
看起來很好,似乎沒有任何問題。日志輸出字符串中包含了兩個調試參數。
所以一切正常,沒有問題?也不盡然。
在記錄日志的代碼中可以看到下面兩個輸入:
?`getone()`
?`gettwo()`
這兩個方法會"一直"調用。這意味著,即使實際可能不會執行 `log` 語句,仍然會計算所有 `log` 方法傳入的參數。
如果這些調用開銷很大,那么可能會浪費大量 CPU 資源。
一種典型的解決方案像下面這樣:
但這種方法相當丑陋:這不正是 `log.debug` 完成的功能嗎?只在啟用調試時才記錄日志。
我們需要的是一個單行調試語句,只在啟用日志記錄時計算輸入的參數。
為了解決類似的情況,我們將應用 Java 8 Supplier 模式,只在需要的時候執行計算。
不幸的是,大多數日志框架并不支持 Supplier 模式。
至少是直接支持。
實際上,`logger` 并不期望輸入的參數一定是字符串,實際參數可以是任意對象。`logger` 會調用對象的 `toString` 方法把它轉換為字符串。這里的訣竅是`logger` 只在日志啟用的情況下調用字符串。
因此,要實現惰性日志只需要用一個對象來包裝 Supplier,該對象僅在調用 toString 時調用 Supplier。
現在可以更新之前的日志代碼,結果如下:
理想情況下,日志框架能直接支持 Supplier。但在等待的過程中,這也是一種變通的辦法。
完整示例代碼,請查看我的 Github 倉庫:<https://github.com/efenglu/lazyLogger>
想知道更多?掃描下面的二維碼關注我
好文推薦:
基于數據庫實現的分布式鎖
基于Redis實現的分布式鎖
為了追求極致的性能,Kafka掌控了這11項要領
>>>Learn More<<
喜歡就點個"在看"唄^_^
總結
- 上一篇: IntelliJ IDEA 2019从入
- 下一篇: 原来这才是日志打印的正确姿势!