Feat Workers Prioridades y Nivel Serilog

This commit is contained in:
2025-09-06 21:44:52 -03:00
parent f384a640f3
commit fa92d9638c
29 changed files with 2068 additions and 95 deletions

View File

@@ -1,12 +1,10 @@
//Elecciones.Worker/Program.cs
using Elecciones.Database;
using Elecciones.Infrastructure.Services;
using Elecciones.Worker;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Net;
using Serilog;
using System.Net.Http;
using System.Net.Security;
using System.Security.Authentication;
using Polly;
@@ -21,12 +19,20 @@ Log.Information("Iniciando Elecciones.Worker Host...");
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddSerilog(config =>
config
// 1. Registra el servicio del interruptor como siempre.
builder.Services.AddSingleton<LoggingSwitchService>();
// 2. Configura Serilog usando AddSerilog.
builder.Services.AddSerilog((services, configuration) => {
var loggingSwitch = services.GetRequiredService<LoggingSwitchService>();
configuration
.ReadFrom.Configuration(builder.Configuration)
.ReadFrom.Services(services)
.Enrich.FromLogContext()
.MinimumLevel.ControlledBy(loggingSwitch.LevelSwitch)
.WriteTo.Console()
.WriteTo.File("logs/worker-.log", rollingInterval: RollingInterval.Day));
.WriteTo.File("logs/worker-.log", rollingInterval: RollingInterval.Day);
});
// --- Configuración de Servicios ---
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
@@ -93,16 +99,47 @@ builder.Services.AddSingleton<RateLimiter>(sp =>
QueueProcessingOrder = QueueProcessingOrder.OldestFirst
}));
builder.Services.AddScoped<IElectoralApiService, ElectoralApiService>();
builder.Services.AddScoped<IElectoralApiService, ElectoralApiService>();
// Registramos el servicio de token como un Singleton para que sea compartido.
builder.Services.AddSingleton<SharedTokenService>();
// Registramos el servicio de configuraciones de workers como un Singleton para que sea compartido.
builder.Services.AddSingleton<WorkerConfigService>();
// Registramos ambos workers. El framework se encargará de iniciarlos y detenerlos.
builder.Services.AddHostedService<CriticalDataWorker>();
builder.Services.AddHostedService<LowPriorityDataWorker>();
//builder.Services.AddHostedService<Worker>();
// --- LÓGICA PARA LEER EL NIVEL DE LOGGING AL INICIO ---
// Creamos un scope temporal para leer la configuración de la BD
using (var scope = builder.Services.BuildServiceProvider().CreateScope())
{
var services = scope.ServiceProvider;
try
{
var dbContext = services.GetRequiredService<EleccionesDbContext>();
var loggingSwitchService = services.GetRequiredService<LoggingSwitchService>();
// Buscamos el nivel de logging guardado en la BD
var logLevelConfig = await dbContext.Configuraciones
.AsNoTracking()
.FirstOrDefaultAsync(c => c.Clave == "Logging_Level");
if (logLevelConfig != null)
{
// Si lo encontramos, lo aplicamos al interruptor
loggingSwitchService.SetLoggingLevel(logLevelConfig.Valor);
Console.WriteLine($"--> Nivel de logging inicial establecido desde la BD a: {logLevelConfig.Valor}");
}
}
catch (Exception ex)
{
// Si hay un error (ej. la BD no está disponible al arrancar), se usará el nivel por defecto 'Information'.
Console.WriteLine($"--> No se pudo establecer el nivel de logging desde la BD: {ex.Message}");
}
}
var host = builder.Build();
try