Вот лямбда-решение, не столь удобное для пользователя, как у @Paul Croarkin в одном смысле (уровень фактически пройден дважды). Но я думаю, что (а) пользователь должен пройти регистратор; и (b) AFAIU в первоначальном вопросе не спрашивал об удобном способе повсюду в приложении, а только в ситуации, когда в библиотеке мало случаев использования.
package test.lambda;
import java.util.function.*;
import org.slf4j.*;
public class LoggerLambda {
private static final Logger LOG = LoggerFactory.getLogger(LoggerLambda.class);
private LoggerLambda() {}
public static void log(BiConsumer<? super String, ? super Object[]> logFunc, Supplier<Boolean> logEnabledPredicate,
String format, Object... args) {
if (logEnabledPredicate.get()) {
logFunc.accept(format, args);
}
}
public static void main(String[] args) {
int a = 1, b = 2, c = 3;
Throwable e = new Exception("something went wrong", new IllegalArgumentException());
log(LOG::info, LOG::isInfoEnabled, "a = {}, b = {}, c = {}", a, b, c);
// warn(String, Object...) instead of warn(String, Throwable), but prints stacktrace nevertheless
log(LOG::warn, LOG::isWarnEnabled, "error doing something: {}", e, e);
}
}
Поскольку slf4j допускает Throwable (чья трассировка стека должна регистрироваться) внутри параметра varargs , я думаю, что нет необходимости перегружать вспомогательный метод log
для других потребителей, кроме (String, Object[])
.