說明:logger.debug("=====" + b)
,若是當前的日誌級別是warn,上述日誌不會打印,但會執行字符串拼接操做,若是b是對象,會調用b的toString()方法,這樣會很是浪費系統資源,特別是當b是個大對象的時候。linux
bad case:segmentfault
log.info("finish import seller " + sellerId) # 有現成的佔位符的方式,不要使用String.format(),代碼複雜 log.info(String.format("group_id=%s",groupId))
good case:性能
logger.info("modify audit status, noteId: [{}], creativityId: [{}]", noteId, creativity.getId());
我的也不推薦條件輸出形式,用這種if的方式判斷,顯然不夠優雅線程
if (logger.isDebugEnabled()) { logger.debug("Processing trade with id: " + id + " and symbol: " + symbol); }
這樣的格式寫法,可讀性更好,對於排查問題又幫助。debug
good case:日誌
logger.info("modify audit status, noteId: [{}], creativityId: [{}]", noteId, creativity.getId())
bad case:code
log.error("Porch: 建立帳號失敗:傳入參數有誤:email={}, name={}", email, name)
good case:orm
logger.warn("建立單元名稱重複,unit_name={}", req.getUnitName())
bad case:對象
log.error("調用sellerCenter服務異常")
good case:內存
logger.error("RPC調用[inventory.multi_get_available]失敗", e);
若是既打錯誤日誌,又拋出異常,會致使錯誤日誌的重複打印。
bad case:
try { ... } catch (TException e) { logger.error("RPC調用[item_center.multi_get_item_union]失敗", e); throw new BaseException(ResponseCode.ITEM_SYSTEM_ERROR); }
good case:
try { ... } catch (TException e) { // e必須傳遞給從新拋出的異常,不然會致使異常棧的丟失 throw new BaseException("xxxx", e); }
linux: 8核 2.4Hz 32G 內存 50個線程,每一個線程寫2W行日誌 logback: 100W行日誌總計耗時:7419 ms 100W行日誌總計耗時:7337 ms 100W行日誌總計耗時:7345 ms 100W行日誌總計耗時:7263 ms 100W行日誌總計耗時:7084 ms log4j2: 100W行日誌總計耗時:3815 ms 100W行日誌總計耗時:3904 ms 100W行日誌總計耗時:3743 ms 100W行日誌總計耗時:3766 ms 100W行日誌總計耗時:3755 ms
將來是log4j2的。