using Infrastructure.Configuration; using Infrastructure.Extensions; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Serilog; using Serilog.Formatting.Json; using Serilog.Sinks.Elasticsearch; using Serilog.Sinks.RollingFile; using System; using System.Collections.Generic; using System.IO; namespace Infrastructure.Web.Hosting { public static class IWebHostBuilderExtensions { public static IWebHostBuilder Config(this IWebHostBuilder hostBuilder, List configValues = null, bool useLogServer = false, bool useConfigServer = false) where TStartup : class { try { var configuration = new ConfigurationBuilder().Config(configValues).Build(); if (useLogServer) { Log.Logger = new LoggerConfiguration() .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200")) {//http://localhost:9200/_search?size=100 TypeName = "_doc", AutoRegisterTemplate = true, AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv7, FailureCallback = e => Console.WriteLine("Unable to submit event " + e.MessageTemplate), EmitEventFailure = EmitEventFailureHandling.WriteToSelfLog | EmitEventFailureHandling.WriteToFailureSink | EmitEventFailureHandling.RaiseCallback, FailureSink = new RollingFileSink("logs/log.txt", new JsonFormatter(), fileSizeLimitBytes: 100 * 1024 * 1024, 1) }) .CreateLogger(); } else { Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration) .WriteTo.Console() .WriteTo.File("logs/log.txt", rollOnFileSizeLimit: true, fileSizeLimitBytes: 100 * 1024 * 1024, rollingInterval: RollingInterval.Infinite) .CreateLogger(); } hostBuilder .UseSerilog() .ConfigureAppConfiguration((hostingContext, builder) => { if (useConfigServer) { //builder.AddNacosConfiguration(x => //{ // x.DataId = "msconfigapp"; // x.Group = ""; // x.Tenant = "f47e0ae1-982a-4a64-aea3-52506492a3d4"; // x.Optional = false; // x.ServerAddresses = new List { "localhost:8848" }; //}); } else { builder.Config(configValues); } }) .UseStartup() .Build() .Run(); } catch (Exception ex) { ex.PrintStack(); Log.Fatal(ex.Message); } finally { Log.CloseAndFlush(); } return hostBuilder; } public static IConfigurationBuilder Config(this IConfigurationBuilder builder, List configValues) { return builder.SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddEFConfiguration(options => options.UseSqlite("Data Source=configuration.db"), configValues ?? new List()) .AddEnvironmentVariables(); } } }