日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

惰性日志

發布時間:2024/4/11 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 惰性日志 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊上方“朱小廝的博客”,選擇“設為星標

做積極的人,而不是積極廢人


來源:itnext.io/lazy-logging-40314cf9bb25


在代碼中添加日志時要當心:有時盡管并沒有記錄日志,也會執行日志語句。例如下面的代碼:


```javalog.debug("I found {} and {}", getone(), gettwo());```


看起來很好,似乎沒有任何問題。日志輸出字符串中包含了兩個調試參數。


所以一切正常,沒有問題?也不盡然。


在記錄日志的代碼中可以看到下面兩個輸入:


  • ?`getone()`

  • ?`gettwo()`


這兩個方法會"一直"調用。這意味著,即使實際可能不會執行 `log` 語句,仍然會計算所有 `log` 方法傳入的參數。


如果這些調用開銷很大,那么可能會浪費大量 CPU 資源。


一種典型的解決方案像下面這樣:


```javaif (log.isDebugEnabled()) { log.debug("I found {} and {}", getone(), gettwo());}```


但這種方法相當丑陋:這不正是 `log.debug` 完成的功能嗎?只在啟用調試時才記錄日志。


我們需要的是一個單行調試語句,只在啟用日志記錄時計算輸入的參數。


為了解決類似的情況,我們將應用 Java 8 Supplier 模式,只在需要的時候執行計算。


不幸的是,大多數日志框架并不支持 Supplier 模式。


至少是直接支持。


實際上,`logger` 并不期望輸入的參數一定是字符串,實際參數可以是任意對象。`logger` 會調用對象的 `toString` 方法把它轉換為字符串。這里的訣竅是`logger` 只在日志啟用的情況下調用字符串。


因此,要實現惰性日志只需要用一個對象來包裝 Supplier,該對象僅在調用 toString 時調用 Supplier。


```javaimport java.util.function.Supplier;public class LazyString { private final Supplier<?> stringSupplier; public static LazyString lazy(Supplier<?> stringSupplier) { return new LazyString(stringSupplier); } public LazyString(final Supplier<?> stringSupplier) { this.stringSupplier = stringSupplier; } @Override public String toString(){ return String.valueOf(stringSupplier.get()); }}```


現在可以更新之前的日志代碼,結果如下:


```javaimport static LazyString.lazy;log.debug("I found {} and {}", lazy(this::getone), lazy(this::gettwo));```


理想情況下,日志框架能直接支持 Supplier。但在等待的過程中,這也是一種變通的辦法。


完整示例代碼,請查看我的 Github 倉庫:<https://github.com/efenglu/lazyLogger>


想知道更多?描下面的二維碼關注我

好文推薦:

  • 基于數據庫實現的分布式鎖

  • 基于Redis實現的分布式鎖

  • 為了追求極致的性能,Kafka掌控了這11項要領


>>>Learn More<<


喜歡就點個"在看"唄^_^

總結

以上是生活随笔為你收集整理的惰性日志的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。