SLF4J-Log4J, похоже, не отключил ведение журнала

Кажется, что, хотя уровень журнала был установлен на 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".


person Oh Chin Boon    schedule 27.12.2011    source источник
comment
У меня есть slf4j-log4j12-1.6.4.jar, slf4j-api-1.6.4.jar и log4j-1.2.16.jar   -  person Oh Chin Boon    schedule 27.12.2011
comment
@staffman извините, я изменил вывод.   -  person Oh Chin Boon    schedule 27.12.2011


Ответы (1)


Это не slf4j, а JVM нужно вычислять каждый переданный параметр перед вызовом функции.

Прочтите внимательнее данную ссылку. slf4j пропускает только вызов toString() для параметров объекта пропущенных операторов журнала. Это не работает для пропуска вызовов функций.

Но вы можете создать для этого собственный объект функтора:

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

Метод toString() будет вызываться только в том случае, если отладка не пропущена.

person Vadzim    schedule 27.12.2011