我有一门课正在使用Flyway对应用程序进行迁移
import lombok.extern.slf4j.Slf4j;
import org.flywaydb.core.Flyway;
import org.flywaydb.core.api.MigrationInfo;
import org.flywaydb.core.api.MigrationInfoService;
import org.flywaydb.core.api.MigrationVersion;
import org.flywaydb.core.api.configuration.FluentConfiguration;
import org.flywaydb.core.api.output.MigrateResult;
import org.flywaydb.core.internal.info.MigrationInfoDumper;
import java.util.Properties;
@Slf4j
public class FlywayService {
Flyway flyway;
public FlywayService(Properties props, String dbServer, String schema, String user, String password) {
FluentConfiguration flywayConfig = Flyway.configure();
flywayConfig.configuration(props);
flywayConfig.dataSource("jdbc:oracle:thin:@" + dbServer, user, password);
flywayConfig.schemas(schema.toUpperCase());
flyway = flywayConfig.load();
}
public void runInfo() {
MigrationInfoService info = flyway.info();
MigrationInfo current = info.current();
MigrationVersion currentSchemaVersion = current == null ? MigrationVersion.EMPTY : current.getVersion();
MigrationVersion schemaVersionToOutput = currentSchemaVersion == null ? MigrationVersion.EMPTY : currentSchemaVersion;
StringBuffer buffer = new StringBuffer();
buffer.append("Schema version: ")
.append(schemaVersionToOutput).append("\n")
.append(MigrationInfoDumper.dumpToAsciiTable(info.all()));
log.info(buffer.toString());
}
}
日志记录是通过lombok(版本1.18.22)@Sl4j完成的。我需要的是捕获Flyway输出到String的所有日志行,以便进行进一步的处理,同时将Flyway记录的行保存在spring.log中。x1c 0d1x
此外,我在对数百个模式进行迁移时运行了Flyway多线程,即使我搜索了几个小时,我仍然没有找到一种方法来实现这一点。
1条答案
按热度按时间6l7fqoea1#
配置所有flyway logger(即logger以名称
org.flywaydb
开头)以将日志输出到具有固定文件路径的文件附加器,然后您的代码将此日志文件中的所有内容读取到一个变量以供进一步处理,这样如何?文件附加器还需要配置为附加,以便将日志转发到原始根日志记录器,后者将日志打印到控制台。还需要配置为"非附加"模式,该模式将在写入日志之前清除文件,以确保日志文件不包含上次运行的日志。
如果需要在多个线程中并发执行Flyway,可以使用路由附加器根据MDC中定义的线程标识符将不同线程的日志转发到各自独立的日志文件中
示例配置如下:
在执行flyway之前的代码中,您需要配置一个线程标识符并将其放入MDC中,类似于: