using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Serilog; using Serilog.Exceptions; using Serilog.Exceptions.Core; using Serilog.Exceptions.EntityFrameworkCore.Destructurers; using Serilog.Sinks.Elasticsearch; using System; using System.Reflection; namespace My.ProjectName { public class Program { public static void Main(string[] args) { // Configure logging first ConfigureLogging(); // Then create the host, so that if the host fails we can log errors CreateHost(args); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }) .ConfigureAppConfiguration(configuration => { configuration.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); configuration.AddJsonFile( $"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true); }) .UseSerilog(); private static void CreateHost(string[] args) { try { CreateHostBuilder(args).Build().Run(); } catch (System.Exception ex) { Log.Fatal($"Failed to start {Assembly.GetExecutingAssembly().GetName().Name}", ex); throw; } } private static void ConfigureLogging() { var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); var configuration = new ConfigurationBuilder() .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile( $"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true) .Build(); Log.Logger = new LoggerConfiguration() .Enrich.FromLogContext() .Enrich.WithExceptionDetails(new DestructuringOptionsBuilder() .WithDefaultDestructurers() .WithDestructurers(new[] { new DbUpdateExceptionDestructurer() })) .Enrich.WithMachineName() .WriteTo.Debug() .WriteTo.Console() .WriteTo.File("logs/log-.log", rollingInterval: RollingInterval.Day, shared: true, retainedFileCountLimit: 7) .WriteTo.Elasticsearch(ConfigureElasticSink(configuration, environment)) .Enrich.WithProperty("Environment", environment) .ReadFrom.Configuration(configuration) .CreateLogger(); } private static ElasticsearchSinkOptions ConfigureElasticSink(IConfigurationRoot configuration, string environment) { return new ElasticsearchSinkOptions(new Uri(configuration["ElasticConfiguration:Uri"])) { AutoRegisterTemplate = true, IndexFormat = $"{Assembly.GetExecutingAssembly().GetName().Name.ToLower().Replace(".", "-")}-{environment?.ToLower().Replace(".", "-")}-{DateTime.UtcNow:yyyy-MM}" }; } } }