經常能看到打印日志的時候,使用以下這種方式打印日志:
logger.debug("the message is " + msg + " from " + somebody);
這種打印日志的方式有個缺點,就是無論日志級別是什么,程序總要先執行 "the message is " + msg + " from " + somebody
這段字符串的拼接操作。當 logger 設置的日志級別為比 DEBUG 級別更高級別時,DEBUG 級別的信息不回被打印出來的,顯然,字符串拼接的操作是不必要的,當要拼接的字符串很大時,這無疑會帶來很大的性能白白損耗。
於是,一種改進的打印日志方式被人們發現了:
if(logger.isDebugEnabled()) { logger.debug("the message is " + msg + " from " + somebody); }
這樣的方式確實能避免字符串拼接的不必要損耗,但這也不是最好的方法,當日志級別為 DEBUG 時,那么打印這行消息,需要判斷兩次日志級別。一次是logger.isDebugEnabled()
,另一次是 logger.debug()
方法內部也會做的判斷。這樣也會帶來一點點效率問題,如果能找到更好的方法,誰願意無視白白消耗的效率。
有一種更好的方法,那就是提供占位符的方式,以參數化的方式打印日志,例如上述的語句,可以是這樣的寫法:
logger.debug("the message {} is from {}", msg, somebody);
這樣的方式,避免了字符串拼接,也避免了多一次日志級別的判斷。