一、示例代码
public static void main(String[] args) { ProvinceCityInfo provinceCityInfo = new ProvinceCityInfo(); provinceCityInfo.setCityId(1); provinceCityInfo.setCityName("北京"); log.info("provinceCityInfo is {}", JSON.toJSONString(provinceCityInfo)); if (log.isInfoEnabled()) { log.info("provinceCityInfo is {}", JSON.toJSONString(provinceCityInfo)); } log.info("provinceCityInfo is {}" + JSON.toJSONString(provinceCityInfo)); }
二、log.isInfoEnabled()
1. log.info("provinceCityInfo is {}", JSON.toJSONString(provinceCityInfo)); 编译后其实是两行代码,先把对象序列化为JSON字符串,再打印
2. 如果不加log.isInfoEnabled(),即使把日志级别跳到了WARN,不打印info,也会序列化对象为JSON字符串
3. 加上了log.isInfoEnabled(),只是做了一次判断,比序列化性能高
三、log.info拼接字符串后再打印和使用占位符的区别
1. 拼接字符串底层使用了StringBuilder,然后使用log.info(String s)打印
2. 直接使用占位符,使用log.info(String format, Object o)打印
3. 至少在代码层面,拼接字符串更耗费性能
四、log.error()重载方法的选择
1. error(String msg)只打印了错误信息,不打印堆栈信息
2. error(String var1, Throwable var2),会打印堆栈信息
public static void main(String[] args) { try { Integer a = 2 / 0; } catch (Exception ex) { log.error("1.error:" + ex.getMessage()); // 1.error:/ by zero log.error("2.error:" + ex); // 2.error:java.lang.ArithmeticException: / by zero log.error("3.error", ex); // 3.error // java.lang.ArithmeticException: / by zero // at com.a.b.TestLog.main(TestLog.java:13) } }