[英]FluentMigrator generate SQL Output from In-Process Migration runner
[英]How do I direct log output to a file, using a FluentMigrator v3.2.15 In-Process runner?
我有一個使用 FluentMigrator 2.0.7 構建的 .NET 4.5.2 遷移運行器,“我正在嘗試遷移到 .NET 5.0 和 FluentMigrator 3.2.15。
我目前的困難是將 output 寫入文本文件。
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 是一個抽象的 class,它無法啟動。
但是如何配置 ServiceProvider,以便在要求 TextWriter 時,它返回一個 StreamWriter,寫入我提供給 LogFileFluentMigratorLoggerOptions 的 OutputFileName?
===
編輯:
我可以做這個:
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 注冊為 singleton 來將 sql output 寫入文本文件,然后對其進行配置。 LogFileFluentMigratorLoggerProvider 繼承自 SqlScriptFluentMigratorLoggerProvider 並負責為您實例化 StreamWriter。
private static IServiceProvider CreateServices()
{
// var connectionString = ""; grab your connection string
return new ServiceCollection()
.AddFluentMigratorCore()
.ConfigureRunner(rb => rb
.AddSqlServer2016()
.WithGlobalConnectionString(connectionString)
.WithMigrationsIn(this.assembly))
.AddLogging(lb => lb.AddFluentMigratorConsole())
.AddSingleton<ILoggerProvider, LogFileFluentMigratorLoggerProvider>()
.Configure<LogFileFluentMigratorLoggerOptions>(
opt =>
{
opt.OutputFileName = "C:\\TEMP\\DatabaseMigration.sql";
opt.OutputGoBetweenStatements = true;
opt.ShowSql = true;
})
.BuildServiceProvider(false);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.