如何使用 FluentMigrator v3.2.15 In-Process runner 将日志输出定向到文件?

问题描述

我有一个使用 FluentMigrator 2.0.7 构建的 .NET 4.5.2 迁移运行程序,“我正在尝试迁移到 .NET 5.0 和 FluentMigrator 3.2.15。

我目前的困难是将输出写入文本文件

var serviceProvider = new ServiceCollection()

    .AddSingleton<ILoggerProvider,sqlScriptFluentMigratorLoggerProvider>()
    
    .Configure<LogFileFluentMigratorLoggerOptions>(o => {
        o.OutputFileName = "MyFilename.log";
    })

    .AddLogging(lb => lb.AddFluentMigratorConsole())
    .Configure<FluentMigratorLoggerOptions>(o =>
    {
        o.Showsql = true;
        o.Showelapsedtime = true;
    })

    .AddFluentMigratorCore()

    .ConfigureRunner(builder => 
        builder
            .AddsqlServer2016()
            .WithGlobalConnectionString(this.options.connectionString.ExpandDataDirectory())
            .WithMigrationsIn(this.assembly)
        )
    
    .BuildServiceProvider();

using (var scope = serviceProvider.CreateScope())
{
    var runner = scope.ServiceProvider.GetrequiredService<IMigrationRunner>();

    if (this.options.reverseMigration)
        runner.MigrateDown(0);
    else
        runner.MigrateUp();
}

我的问题很简单 - 当我尝试运行迁移时出现错误

尝试激活“FluentMigrator.Runner.Logging.sqlScriptFluentMigratorLoggerProvider”时无法解析“System.IO.TextWriter”类型的服务。

发生的事情很简单 - TextWriter 是一个抽象类,无法启动。

但是我如何配置 ServiceProvider 以便当它被要求提供 TextWriter 时,它返回一个写入我提供给 LogFileFluentMigratorLoggerOptions 的 OutputFileName 的 StreamWriter?

===

已编辑:

我可以这样做:

using var logStream = new FileStream(this.options.outputFilename,FileMode.Append);
using var sw = new StreamWriter(logStream);

var serviceProvider = new ServiceCollection()

    .AddSingleton<TextWriter>(sw)

    .AddSingleton<ILoggerProvider,sqlScriptFluentMigratorLoggerProvider>()

    ...

但我觉得很丑……

解决方法

我可以通过将 LogFileFluentMigratorLoggerProvider 注册为单例然后配置它来将 sql 输出写入文本文件。 LogFileFluentMigratorLoggerProvider 继承自 SqlScriptFluentMigratorLoggerProvider 并负责为您实例化 StreamWriter。

ShipWeapon