关于Slf4j中占位符{}

Posted Firm陈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Slf4j中占位符{}相关的知识,希望对你有一定的参考价值。

日志输出中{}很好用(具体可参看:https://blog.csdn.net/Dongguabai/article/details/83719754
在这里插入图片描述
{}的确使用很方便,但是大多数博客文章说使用{}会性能更好,到底怎么样可以从源码中看看(其实可以大致猜测一下,哪怕代码玩出花来,也要找到每个{}的位置进行替换吧)。
测试代码:
在这里插入图片描述
org.slf4j.helpers.MessageFormatter#arrayFormat(java.lang.String, java.lang.Object[], java.lang.Throwable):
在这里插入图片描述
本质也需要获取每个参数,找到位置通过StringBuilder拼接。所以不能说使用了{}效率更高,但是一般参数不会很多,数组遍历速度也是很快的,总体效率差是可以忽略的。

package test;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import java.util.ArrayList;
import java.util.List;
 
/**
 * @author Dongguabai
 * @date 2018/11/4 20:41
 */
public class TestLog {
    private static final Logger logger = LoggerFactory.getLogger(TestLog.class);
 
    public static void main(String[] args) {
        List<Long> sum = new ArrayList<Long>(10);
        for (int i2 = 0; i2 < 10; i2++) {
            long start = System.currentTimeMillis();
            for (int i = 0; i < 100000; i++) {
                  test1();//用时:[4268, 4151, 4207, 4124, 4163, 4116, 4099, 4198, 4173, 4076]
                //test2();//用时:[4422, 4067, 4086, 4067, 4068, 4113, 4082, 4075, 4058, 4145]
            }
            long end = System.currentTimeMillis();
            sum.add(end - start);
        }
        System.out.println("用时:" + sum);
    }
 
    public static void test1() {
        logger.error("aaa{}ccc{}eee{}ggg{}iii{}kkk{}lll", "bbb", "ddd", "fff", "hhh", "jjj", "mmm");
    }
 
    public static void test2() {
        logger.error(new StringBuilder("aaa").append("bbb").append("ccc").append("ddd").append("eee").append("fff").append("ggg").append("hhh").append("iii").append("jjj").append("kkk").append("mmm").append("lll").toString());
    }
}

更多:slf4j比log4j更优秀的一点是可以使用占位符

注意:一个{},对应一个变量。

以上是关于关于Slf4j中占位符{}的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SLF4J 使用占位符记录异常和消息

SLF4J

布局中的片段占位符

为啥要使用SLF4J而不是Log4J

为啥要使用SLF4J而不是Log4J

为啥使用 SLF4J 而不是 Log4J 来做 Java 日志