log.info("xxxxx {}",xxx.toString());
mentor 提示這邊需要注意效率問題info級别跟系統列印日志級别相同 toString()方法一定會執行,但是如果為debug級别toString()方法會執行但是日志不會列印造成效率問題。
深入:
review代碼時,發現太多人習慣log日志直接用“+”号連接配接。這是很不好的習慣。
In Logger, the logging methods are overloaded with forms that accept one, two or more values.[9] Occurrences of the simple pattern {} in the log message are replaced in turn with the values. This is simple to use yet provides a performance benefit when the values have expensive toString() methods. When logging is disabled at the DEBUG level, the logging framework does not need to evaluate the string representation of the values. In the following example, the values count or userAccountList only need to be evaluated when DEBUG is enabled; otherwise the overhead of the debug call is trivial.
private static final Logger LOG = LoggerFactory.getLogger(Wombat.class);
LOG.debug("There are now " + count + " user accounts: " + userAccountList); // slow
LOG.debug("There are now {} user accounts: {}", count, userAccountList); // faster
123
如上面demo,請選擇第二種書寫方式。
原因1,第二種使用占位符隻有當日志級别是debug,才會執行count和userAccountlist的toString方法,而第一種非debug級别也會執行。
原因2,更具可讀性。
第一種無論是debug還是其他級别,都會執行輸入值的toString方法,第二種隻有在debug級别才會執行。
其次使用占用符 和使用string 字元拼接底層都是使用StringBuilder()進行實作。多字元情況下使用占位符效率會稍高。具體選擇根據個人喜好。需要注意占位符個數少于傳入實參的時候。不會報錯,實參進行映射的時候會有一個順序問題。使用sonarlint插件可以進行掃描避免這個問題。
下面還有一些總結的列印日志的技巧
- 日志列印的級别
級别 | 内容 |
---|---|
ERROR | 發生了嚴重的錯誤,必須馬上處理。這種級别的錯誤是任何系統都無法容忍的。比如:空指針異常,資料庫不可用,關鍵路徑的用例無法繼續執行。 |
WARN | 還會繼續執行後面的流程,但應該引起重視。其實在這裡我希望有兩種級别:一個是存在解決方案的明顯的問題(比如,"目前資料不可用,使用緩存資料"),另一個是潛在的問題和建議(比如“程式運作在開發模式下”或者“管理控制台的密碼不夠安全”)。應用程式可以容忍這些資訊,不過它們應該被檢查及修複。 |
DEBUG | 開發人員關注的事。後面我會講到什麼樣的東西應該記錄到這個級别。 |
TRACE | 更為詳盡的資訊,隻是開發階段使用。在産品上線之後的一小段時間内你可能還需要關注下這些資訊,不過這些日志記錄隻是臨時性的,最終應該關掉。DEBUG和TRACE的差別很難區分,不過如果你加了一行日志,在開發測試完後又删了它的話,這條日志就應該是TRACE級别的。 |
- 日志内容列印的時候 語義要清楚 可以友善進行錯誤排查 ,一般在請求方法或者遠端調用的時候列印出入參和出參。對于出入參數 使用占位符,同時對于字元串的拼接使用ToStringBuilder(非反射實作) 對于數組 或者集合的列印使用Arrays.deepToString();
- 當抛出一個異常的時候 不需要再列印日志,因為這樣會重複列印日志。
- 列印錯誤日志異常資訊的正确列印方法 log.error("Error reading configuration file", e);
- 日志可讀性需要考慮,比如日期格式類的轉換。