#java #log4j2 #slf4j
#java #log4j2 #slf4j
Вопрос:
В моем java-проекте я использую log4j.
Вот пример кода:
import org.apache.log4j.Logger;
private static final Logger logger = Logger.getLogger(Main.class);
logger.assertLog(progressBar.getMaximum() <= 100,
"progressBar.getMaximum() > 100")
Неплохо. Все работает нормально.
Но я хочу перейти на log4j2 и использовать org.slf4j.Logger
.
Итак, теперь я использую это:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(App.class);
logger.assertLog(progressBar.getMaximum() <= 100,
"progressBar.getMaximum() > 100");
Но теперь я получаю сообщение об ошибке:
Can's find symbol `assertLog`.
Как заменить assertLog
для использования в org.slf4j
?
Ответ №1:
Такого метода просто не существует ни в slf4j, ни в log4j2 (ни в logback, ни в flogger, ни в tinylog), поскольку такая практика в настоящее время не одобряется. В современном коде гораздо чаще возникает сбой при сбое предварительного условия или инварианта и полагаться на тесты и фактические утверждения для их принудительного выполнения. См., Например, Руководство Google Guava по условным сбоям: https://github.com/google/guava/wiki/ConditionalFailuresExplained (вот их утилиты для создания исключений: Preconditions
или Verify
)
Поэтому лучше всего сделать что-то вроде этого:
if (progressBar.getMaximum() > 100) {
logger.warn("Progressbar exceeded 100%!")
}
Конечно, вы можете полностью написать для этого свою собственную утилиту:
class Logging {
private Logging() {
// static utility class
}
public void assertLog(Logger logger, boolean condition, String message) {
if (!condition) {
logger.warn(message);
}
}
}