SLF4J-Log4J не имеет отключенной регистрации - PullRequest
5 голосов
/ 27 декабря 2011

Похоже, что хотя уровень журнала был установлен на 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 "Запись в журнал производительности"

1 Ответ

6 голосов
/ 27 декабря 2011

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

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

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

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

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

...