2014-09-01 216 views
2

我有一个配置为使用SLF4J + Logback的小应用程序。我从Flyway获取JUL输出,我希望Logback能够处理这些输出。Flyway 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使用我的日志记录后端的任何想法?

回答

1

迁飞2不承认的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); } 
       }; 
      } 
     });