java 捕获SpringBoot应用程序中包的@Sl4j输出

nnvyjq4y  于 2023-03-06  发布在  Java
关注(0)|答案(1)|浏览(113)

我有一门课正在使用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多线程,即使我搜索了几个小时,我仍然没有找到一种方法来实现这一点。

6l7fqoea

6l7fqoea1#

配置所有flyway logger(即logger以名称org.flywaydb开头)以将日志输出到具有固定文件路径的文件附加器,然后您的代码将此日志文件中的所有内容读取到一个变量以供进一步处理,这样如何?
文件附加器还需要配置为附加,以便将日志转发到原始根日志记录器,后者将日志打印到控制台。还需要配置为"非附加"模式,该模式将在写入日志之前清除文件,以确保日志文件不包含上次运行的日志。
如果需要在多个线程中并发执行Flyway,可以使用路由附加器根据MDC中定义的线程标识符将不同线程的日志转发到各自独立的日志文件中
示例配置如下:

<Appenders>
   <Routing name="Routing">
            <Routes pattern="$${ctx:threadId}">
                <Route>
                    <File fileName="/logs/flyway-${ctx:threadId}.log"
                            name="flyway-${ctx:threadId}"
                            append="false">                     
                    </File>
                </Route>
            </Routes>
        </Routing>
</Appenders>

<Loggers>
   <Logger name="org.flywaydb" level="DEBUG" >
            <AppenderRef ref="Routing"/>
    </Logger>
</Loggers>

在执行flyway之前的代码中,您需要配置一个线程标识符并将其放入MDC中,类似于:

String threadId = threadId +  UUID.randomUUID().toString();

ThreadContext.put("threadId", threadId);

//execute flyway

//read all content from log to a string to further process
Path logFilePath = Path.of("/logs/flyway-" + threadId + ".log");
String logs = Files.readString(logFilePath);

ThreadContext.clearAll();

相关问题