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

diy*_*iya 47 java slf4j

我使用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);
Run Code Online (Sandbox Code Playgroud)

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

sbr*_*ges 55

3是最好的.

3和2生成相同(或几乎相同)的字节码,但3更容易键入并且更短,因此3优于2.

如果未启用跟踪,则1必须执行字符串连接("存储时间"+计数+ ....)这有点昂贵,而2仅在启用跟踪时执行字符串连接,这就是为什么3优于3 1.

  • 3不编译. (3认同)

Cek*_*eki 30

除了SLF4J 1.6.x不支持之外,3是最好的.对于三个或更多参数,您需要第二个表单.第三种形式仅适用于一个或两个参数(但不是三个或更多).

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


Фим*_*рин 7

第三种变体是最好的.

实际上,第一种情况是通过StringBuilder进行字符串连接.

第2和第3个案例是相同的.他们需要将整数值设置为Integer(或其他Object),然后创建一个数组来打包它们.

在我的机器上进行的简单测试表明,如果没有执行记录,第三种变体在大约8次更好(56ns vs 459ns).

public class LogTest {
    private static final Logger logger = LoggerFactory.getLogger(LogTest.class);

    public static void main(String[] args) {
        int size = 100_000_000;

        long start = System.nanoTime();
        for (int i = 0; i < size; i++) {
            logger.trace("1 {} 2 {} 3 {}", i, i, i);
        }
        System.out.println((System.nanoTime() - start) / size);

        start = System.nanoTime();
        for (int i = 0; i < size; i++) {
            logger.trace("1 " + i + " 2 " + i + " 3 " + i);

        }
        System.out.println((System.nanoTime() - start) / size);
    }
}
Run Code Online (Sandbox Code Playgroud)