打印日志优化

一、示例代码

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)
        }
    }
原文地址:https://www.cnblogs.com/june0816/p/14246024.html