Регистрация пролетного пути с Logback
У меня есть небольшое приложение, настроенное для использования SLF4J + Logback. Я получаю вывод JUL от Flyway, который я бы хотел обработать.
FlywayWrapper.java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FlywayWrapper {
private static final Logger logger = LoggerFactory.getLogger(FlywayWrapper.class);
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date{ISO8601} [%thread] %-5level %logger{0}: %msg%n</pattern>
</encoder>
</appender>
<logger name="com.foo.test" level="INFO" additivity="false">
<appender-ref ref="STDOUT" />
</logger>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
И я вижу запись в консоль примерно так:
2014-09-01 12:53:47,405 [main] INFO FlywayWrapper: Operation >> migrate
Sep 01, 2014 12:53:47 PM org.flywaydb.core.internal.dbsupport.DbSupportFactory createDbSupport
INFO: Database: jdbc:postgresql://localhost:5433/test (PostgreSQL 9.2)
Sep 01, 2014 12:53:47 PM org.flywaydb.core.internal.command.DbValidate validate
INFO: Validated 3 migrations (execution time 00:00.055s)
Я заметил это в org.flywaydb.core.internal.util.logging.LogFactory
вероятно, именно поэтому JUL используется.
public static Log getLog(Class<?> clazz) {
if (logCreator == null) {
FeatureDetector featureDetector = new FeatureDetector(Thread.currentThread().getContextClassLoader());
if (featureDetector.isAndroidAvailable()) {
logCreator = new AndroidLogCreator();
} else if (featureDetector.isApacheCommonsLoggingAvailable()) {
logCreator = new ApacheCommonsLogCreator();
} else {
logCreator = new JavaUtilLogCreator();
}
}
return logCreator.createLogger(clazz);
}
Любые идеи о том, как заставить Flyway использовать мой бэкэнд регистрации?
3 ответа
Это будет поддерживаться как часть выпуска 3.1: https://github.com/flyway/flyway/issues/834
Flyway 2 не распознает наличие Logback, но его легко настроить.
Вам нужно вызвать статический метод com.googlecode.flyway.core.util.logging.LogFactory.setLogCreator
из вашего кода, прежде чем использовать Flyway, и дать ему собственную реализацию com.googlecode.flyway.core.util.logging.Log
интерфейс, который должен быть простой оберткой с использованием регистратора Slf4j.
Примерно так будет работать:
com.googlecode.flyway.core.util.logging.LogFactory.setLogCreator(
new com.googlecode.flyway.core.util.logging.LogCreator() {
@Override
public com.googlecode.flyway.core.util.logging.Log createLogger(final Class<?> clazz) {
return new com.googlecode.flyway.core.util.logging.Log() {
private final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(clazz);
@Override
public void debug(String message) { logger.debug(message); }
@Override
public void info(String message) { logger.info(message); }
@Override
public void warn(String message) { logger.warn(message); }
@Override
public void error(String message) { logger.error(message); }
@Override
public void error(String message, Exception e) { logger.error(message, e); }
};
}
});
Необходимо настроить Flyway.
Flyway.configure()
.loggers("slf4j")
.load()
В этой документации есть несколько других способов настройки логгера для Flyway.Документация Flyway &gt; Интерфейс командной строки и API Flyway &gt; Конфигурация &gt; Параметры &gt; Регистраторы