Не удается найти assertLog в org.slf4j

#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);
        }
    }

}