Опираясь на Andreas' answer, я могу думать о нескольких подходах к проблеме только выполняя форматирование, если Logger.isDebugEnabled
возвращает true
:
Вариант 1: Передайте флаг «сделать форматирование»
Один из вариантов - иметь аргумент метода, который указывает, действительно ли выполнять форматирование.Прецедент может быть:
System.out.println(lazyFormat(true, "Hello, %s.", "Bob"));
System.out.println(lazyFormat(false, "Hello, %s.", "Dave"));
Где выход будет:
Hello, Bob.
null
Код для lazyFormat
является:
private String lazyFormat(boolean format, final String s, final Object... o) {
if (format) {
return String.format(s, o);
}
else {
return null;
}
}
В этом случае String.format
только выполняется, когда format
флаг установлен на true
, и если он установлен на false
, он вернет null
. Это остановит форматирование сообщения о регистрации и просто отправит некоторую «фиктивную» информацию.
Так Прецедент с регистратором может быть:
logger.debug(lazyFormat(logger.isDebugEnabled(), "Message: %s", someValue));
Этот метод не совсем подходит для форматирования, который просил в этом вопросе.
Вариант 2: Проверьте Logger
Другой подход, чтобы спросить регистратора непосредственно, если это isDebugEnabled
:
private static String lazyFormat(final String s, final Object... o) {
if (logger.isDebugEnabled()) {
return String.format(s, o);
}
else {
return null;
}
}
При таком подходе предполагается, что logger
будет видно в lazyFormat
метод. И польза от этого подхода заключается в том, что абонент не нужно будет проверять метод isDebugEnabled
когда lazyFormat
называется, так что типичное использование может быть:
logger.debug(lazyFormat("Debug message is %s", someMessage));
Более поздние версии Log4J позволяют замещать параметры, см. http://stackoverflow.com/a/14078904/620113 – computermacgyver
Действительно ли это работает - он будет форматировать строку, но делает ли она «ленивую» вещь? Я сделал небольшой тест, в котором аргументы lazyFormat являются вызовами функции, которая печатает в System.err, и казалось, что аргументы в Object ... o получают оценку, даже если String.format (s, o) не является. – OneSolitaryNoob
OneSolitaryNoob - Это не делает ленивую вещь. Поставщик ответа указывает, что это можно сделать, используя метод isDebugEnabled() в методе toString(). Я предоставил более общий ленивый шаблон регистрации в моем ответе: http://stackoverflow.com/a/18317629/501113 – chaotic3quilibrium