Java SLF4J-Log4J似乎没有禁用日志记录

Java SLF4J-Log4J似乎没有禁用日志记录,java,logging,log4j,slf4j,Java,Logging,Log4j,Slf4j,虽然日志级别设置为INFO,但SLF4J仍在计算表达式 package com.ab.test.slf4j; import org.apache.log4j.PropertyConfigurator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SimpleTest { static final Logger logger = LoggerFactory.getLogger(SimpleT

虽然日志级别设置为INFO,但SLF4J仍在计算表达式

package com.ab.test.slf4j;

import org.apache.log4j.PropertyConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

    public static void main(String[] args) {
        PropertyConfigurator.configure("log4j.properties");

        logger.debug("Test " + testEnter());

        logger.debug("Test {}", testEnter());
    }

    public static String testEnter() {
        System.out
                .println("If you see this it means your expression is evaluated :(");

        return "test";
    }
}
Log4J属性文件:

log4j.rootLogger=INFO, CA
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
运行输出:

If you see this it means your expression is evaluated :(
If you see this it means your expression is evaluated :(

编辑:修改了运行输出,如图所示,将计算表达式,但不会计算日志消息。表达式不应按照

进行计算。它不是slf4j,但JVM需要在函数调用之前计算每个传递的参数

请更仔细地阅读给定的链接。 slf4j仅跳过对跳过的日志语句的对象参数调用toString()。它不适用于跳过函数调用

但您可以为此创建自定义函子对象:

    logger.debug(new Object() {
        @Override
        public String toString() {
            return "some expensive test data";
        }
    });

只有在不跳过调试的情况下才会调用toString()方法。

Im拥有slf4j-log4j12-1.6.4.jar、slf4j-api-1.6.4.jar和log4j-1.2.16。jar@staffman对不起,我修改了输出。