使用Logback进行Flyway日志记录



我有一个小应用程序配置为使用SLF4J+Logback。我正在从Flyway获得JUL输出,我希望Logback能够处理它。

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.1版本的一部分得到支持:https://github.com/flyway/flyway/issues/834

Flyway2不识别Logback的存在,但它很容易配置。

在使用Flyway之前,您需要从代码中调用静态方法com.googlecode.flyway.core.util.logging.LogFactory.setLogCreator,并为其提供自己的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文档>飞汇CLI和API>配置>参数>记录器

最新更新