using Serilog; using Serilog.Formatting.Compact; namespace SeriLoog.Extensions; public static class SerilogBuilderExtensions { /// /// Configures Serilog (console, file and MongoDB sinks) plus request logging, /// and registers and . /// public static WebApplicationBuilder AddSerilogRequestLogging(this WebApplicationBuilder builder) { var configuration = builder.Configuration; var mongoConnectionString = configuration.GetConnectionString("MongoDb") ?? "mongodb://localhost:27017"; var mongoDatabase = configuration["MongoDb:DatabaseName"] ?? "SeriLoog"; var mongoCollection = configuration["MongoDb:Collections:Logs"] ?? "logs"; var logFilePath = configuration["MongoDb:LogFilePath"]; builder.Services.AddHttpContextAccessor(); builder.Host.UseSerilog((context, services, loggerConfiguration) => { loggerConfiguration .MinimumLevel.Verbose() .MinimumLevel.Override("Microsoft.AspNetCore", Serilog.Events.LogEventLevel.Warning) .Enrich.FromLogContext() .Enrich.WithProperty("Application", "SeriLoog") .Enrich.With(new HttpContextEnricher(services.GetRequiredService())) .WriteTo.Console() .WriteTo.MongoDB( $"{mongoConnectionString}/{mongoDatabase}", collectionName: mongoCollection); if (!string.IsNullOrWhiteSpace(logFilePath)) { loggerConfiguration.WriteTo.File( formatter: new CompactJsonFormatter(), path: logFilePath, rollingInterval: RollingInterval.Day, retainedFileCountLimit: 14, shared: true); } }); builder.Services.AddSingleton(new LogStoreOptions { MongoConnectionString = mongoConnectionString, MongoDatabase = mongoDatabase, MongoCollection = mongoCollection, LogFilePath = logFilePath }); builder.Services.AddSingleton(); return builder; } }