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