Подтвердить что ты не робот

Параметрированное ведение журнала SLF4J с использованием метода varargs

Я должен быть глуп или что-то в этом роде, но, похоже, я не могу использовать varargs-utilizing параметризованные методы ведения журнала SLF4J. Пример:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggingTest {

    @Test
    public void loggingTest() {
        Logger logger = LoggerFactory.getLogger(this.getClass());
        int x = 0xdeadbeef;
        long y = 0xdeadbeef;

        try {
            throw new Exception("This is a mighty exception!");
        } catch(Exception e) {
            logger.error("I wanna log {} and {} and {} with backtrace", x, y, 3, e);
        }
    }
}

В методе ведения журнала eclipse создает такое предупреждение:

The method error(String, Object, Object) in the type Logger is not applicable for the arguments (String, int, long, int, Exception)

и не скомпилируется.

Однако, если я изменю вызов регистрации на:

logger.error("I wanna log {} and {} and {} with backtrace", new Object[]{x, y, 3, e});

Он компилируется и запускается, как ожидалось (протоколирование 3 "переменных" и трассировка стека исключений).

Варианты библиотеки: slf4j-api-1.7.5.jar, slf4j-log4j12-1.7.5.jar и log4j-1.2.14.jar, если это имеет значение.

Если кто-нибудь укажет на недостатки моих мыслящих способностей, это будет очень оценено!

4b9b3361

Ответ 1

Я провел некоторое дополнительное исследование, и единственный способ получить ошибку компиляции для

logger.error("I wanna log {} and {} and {} with backtrace", x, y, 3, e);

а не для

logger.error("I wanna log {} and {} and {} with backtrace", new Object[]{x, y, 3, e});

- использовать версию API SLF4J до версии 1.7 (в которой была введена поддержка varargs). Вам, вероятно, нужно заглянуть в свой путь к классам (или время выполнения сервера?), Чтобы найти, где следующий оператор не может быть правдой:

Варианты библиотеки: slf4j-api-1.7.5.jar, slf4j-log4j12-1.7.5.jar и log4j-1.2.14.jar, если это имеет значение.

(потому что он точно делает именно ту разницу, которую вы наблюдали)