elsa-core/src/modules/Elsa.Diagnostics.StructuredLogs.Persistence.Sqlite/Extensions/SqliteStructuredLogsModuleExtensions.cs
Sipke Schoorstra 0687b5f9f3
Fix SQLite structured log shell lifecycle (#7461)
* Fix SQLite structured log shell lifecycle

* Address Greptile lifecycle feedback

* Tighten structured log lifecycle guards

* Address structured log background task review
2026-05-18 01:04:04 +02:00

68 lines
3.3 KiB
C#

using Elsa.Common;
using Elsa.Diagnostics.StructuredLogs.Features;
using Elsa.Diagnostics.StructuredLogs.Persistence.Relational.Contracts;
using Elsa.Diagnostics.StructuredLogs.Persistence.Relational.Extensions;
using Elsa.Diagnostics.StructuredLogs.Persistence.Relational.Options;
using Elsa.Diagnostics.StructuredLogs.Persistence.Sqlite.Features;
using Elsa.Diagnostics.StructuredLogs.Persistence.Sqlite.Options;
using Elsa.Diagnostics.StructuredLogs.Persistence.Sqlite.Services;
using Elsa.Extensions;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
namespace Elsa.Diagnostics.StructuredLogs.Persistence.Sqlite.Extensions;
public static class SqliteStructuredLogsModuleExtensions
{
public static StructuredLogsFeature UseSqliteStorage(this StructuredLogsFeature feature, string connectionString, Action<SqliteStructuredLogOptions>? configure = null)
{
feature.Module.Use<SqliteStructuredLogPersistenceFeature>(sqlite =>
{
sqlite.ConfigureOptions = options =>
{
options.ConnectionString = connectionString;
configure?.Invoke(options);
};
});
return feature;
}
public static StructuredLogsFeature UseSqliteStorage(this StructuredLogsFeature feature, Action<SqliteStructuredLogOptions>? configure = null)
{
feature.Module.Use<SqliteStructuredLogPersistenceFeature>(sqlite => sqlite.ConfigureOptions = configure);
return feature;
}
public static IServiceCollection AddSqliteStructuredLogPersistence(this IServiceCollection services, Action<SqliteStructuredLogOptions>? configure = null)
{
if (configure != null)
services.Configure(configure);
services.AddOptions<SqliteStructuredLogOptions>();
services.AddOptions<RelationalStructuredLogOptions>().Configure<IOptions<SqliteStructuredLogOptions>>((relational, sqlite) => Copy(sqlite.Value.Relational, relational));
services.TryAddSingleton<IRelationalStructuredLogConnectionFactory, SqliteStructuredLogConnectionFactory>();
services.TryAddSingleton<IRelationalStructuredLogDialect, SqliteStructuredLogDialect>();
services.TryAddSingleton<IStructuredLogSchemaMigrator, SqliteStructuredLogSchemaMigrator>();
services.TryAddSingleton<SqliteStructuredLogStartupService>();
services.AddHostedService(sp => sp.GetRequiredService<SqliteStructuredLogStartupService>());
services.AddScoped<IStartupTask>(sp => sp.GetRequiredService<SqliteStructuredLogStartupService>());
services.AddRelationalStructuredLogPersistence();
return services;
}
private static void Copy(RelationalStructuredLogOptions source, RelationalStructuredLogOptions target)
{
target.WriteQueue.Capacity = source.WriteQueue.Capacity;
target.WriteQueue.BatchSize = source.WriteQueue.BatchSize;
target.WriteQueue.FlushInterval = source.WriteQueue.FlushInterval;
target.WriteQueue.ShutdownFlushTimeout = source.WriteQueue.ShutdownFlushTimeout;
target.Retention.MaxAge = source.Retention.MaxAge;
target.Retention.MaxRows = source.Retention.MaxRows;
target.Retention.CleanupOnStartup = source.Retention.CleanupOnStartup;
}
}