Параметрированное ведение журнала 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, если это имеет значение.
Если кто-нибудь укажет на недостатки моих мыслящих способностей, это будет очень оценено!
Ответы
Ответ 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, если это имеет значение.
(потому что он точно делает именно ту разницу, которую вы наблюдали)