关于debug日志优化琐事

565 阅读1分钟

代码中常见debug日志输出形式

 if (log.isDebugEnabled()) {
            log.debug("hello" + "log");
        }

外一种

log.debug("{}", "hello" + "log");

那么这两种debug输出方式有区别吗?网上有些资料显示说这两种方式等价,后一种属于前一种的简化方式,下面通过代码验证一番

将logback日志级别设置为error

<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="30 seconds" packagingData="true">
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="error">
        <appender-ref ref="CONSOLE"></appender-ref>
    </root>
</configuration>

在日志级别为error下,按两种方式debug日志各100w次,统计消耗时间

    @Test
    public void debugTest() {
        Stopwatch stopwatch = Stopwatch.createStarted();
        for (int i=0 ;i< 10;i++) {
            isDebug();
        }
        System.out.println(stopwatch.elapsed(TimeUnit.MILLISECONDS));
        Stopwatch stopwatch2 = Stopwatch.createStarted();
        for (int i=0 ;i< 10;i++) {
            debugPlaceholder();
        }
        System.out.println(stopwatch2.elapsed(TimeUnit.MILLISECONDS));
    }

    private static void isDebug() {
        if (log.isDebugEnabled()) {
            log.debug(acquireMsg());
        }
    }

    private static void debugPlaceholder() {
        log.debug("{}", acquireMsg());
    }

    private static String acquireMsg() {
        String str = "hello";
        try {
            //假设执行运算表达式逻辑
            TimeUnit.MILLISECONDS.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return str;
    }

第二种debug(debug({},"xxxx"))方式耗时明显大于第一种,说明第二中方式执行了参数计算逻辑,通过断点的方式也可以证明。在if中可以通过占位符方式输出日志。