Непонятно, когда API SLF4J догонит, но API-интерфейс Java 8 core позволяет отложить любой потенциально дорогостоящий расчет до точки после проверки уровня ведения журнала, поэтому этого не происходит, если конкретный уровень не является loggable:
import java.util.logging.Logger;
public class LogAbbr {
final static int LIMIT = 15;
public static void main(String[] args) {
Logger log=Logger.getAnonymousLogger();
String[] examples={"short string", "rather long string"};
for(String responseContent: examples) {
log.info(() -> String.format("RESPONSE: %."+LIMIT+"s%s",
responseContent, responseContent.length()<=LIMIT? "": "..."));
}
}
}
Обратите внимание, что когда LIMIT
является константой во время компиляции, "RESPONSE: %."+LIMIT+"s%s"
является константой во время компиляции тоже, следовательно, нет необходимости вручную встраивать число, так что использование имени константы обеспечивает согласованность между форматирование строки и условное.
Demo on Ideone:
Jan 27, 2017 11:53:20 AM Ideone main
INFO: RESPONSE: short string
Jan 27, 2017 11:53:20 AM Ideone main
INFO: RESPONSE: rather long str...
Следующая программа показывает, что расчет не происходит, когда уровень лог запрещает:
Logger log=Logger.getAnonymousLogger();
String[] examples={"short string", "rather long string"};
for(String responseContent: examples) {
log.info(() -> {
System.out.println("Potentially expensive operation with "+responseContent);
return responseContent;
});
log.setLevel(Level.SEVERE);
}
Demo on Ideone:
Если вы хотите «а держать его ядро Java», следует учитывать, что не существует 'метод trace' в ядре Java регистраторе и' {} 'не поддерживается стандартный форматтер. – Holger
Наша команда стандартизирована на SLF4J, но я бы предпочел не использовать ее. – Adam
Я вижу, что вы говорите. Я отредактирую SLF4J '{}' в вопросе. – Adam