有没有正确的方法在slf4j中传递参数?

2022-08-31 15:54:04

我使用slf4j来跟踪信息。我的代码是

private static final Logger log = LoggerFactory.getLogger(ObjectTest.class);

log.trace("Time taken to store " + count
            + " objects of size " + size +  " is " + (time) + " msecs");

log.trace("Time taken to store {} objects of size {} is {} msecs",
        new Object[] { count, size, time });

log.trace("Time taken to store {} objects of size {} is {} msecs",
        count, size, time);

这将是记录跟踪的首选机制。


答案 1

3是最好的。

3 和 2 生成相同(或几乎相同)的字节码,但 3 更易于键入且更短,因此 3 比 2 好。

如果未启用跟踪,则 1 必须执行字符串串联(“存储所花费的时间” + 计数 + ....)这有点昂贵,而2仅在启用trace时才进行字符串串联,这就是为什么3比1好的原因。


答案 2

3 是最好的,只是 SLF4J 1.6.x 不支持它。对于三个或更多参数,您需要第二种形式。第三种形式只适用于一个或两个参数(但不适用于三个或更多)。

从 SLF4J 1.7 开始,第三种形式现在也支持 3 个或更多参数。Java 编译器以静默方式将具有 3 个或更多参数的调用转换为第二种形式,并将 Object[] 传递给打印方法。这是Java中varargs的实现细节,允许SLF4J 1.7与SLF4J 1.6 100%兼容。


推荐