using System; using System.Diagnostics; using System.IO; using System.Linq; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Serilog; using Serilog.Core; using Serilog.Events; using Serilog.Sinks.MSSqlServer; namespace Chatbot.Api { public class Program { public static void Main(string[] args) { if (!args.Contains("--docker")) { var pathToExe = Process.GetCurrentProcess().MainModule.FileName; var pathToContentRoot = Path.GetDirectoryName(pathToExe); Directory.SetCurrentDirectory(pathToContentRoot); } var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables() .Build(); var connectionString = configuration.GetConnectionString("DatabaseConnection"); var loggingLevelParam = configuration.GetValue("Logging:LogLevel:Default"); var loggingLevelOk = Enum.TryParse(loggingLevelParam, out LogEventLevel loggingLevel); if (!loggingLevelOk) throw new Exception($"Logging level '{loggingLevelParam}' is not valid."); var loggingLevelSwitch = new LoggingLevelSwitch(loggingLevel); var columnOptions = new ColumnOptions(); columnOptions.Store.Remove(StandardColumn.Properties); columnOptions.Store.Remove(StandardColumn.MessageTemplate); columnOptions.Store.Add(StandardColumn.LogEvent); var mssqlSinkOptions = new MSSqlServerSinkOptions() { AutoCreateSqlTable = true, TableName = "__Logs" }; Log.Logger = new LoggerConfiguration() .MinimumLevel.ControlledBy(loggingLevelSwitch) .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) .Enrich.FromLogContext() .WriteTo.Console() .WriteTo.MSSqlServer(connectionString, mssqlSinkOptions, columnOptions: columnOptions) .CreateLogger(); try { var urls = configuration.GetValue("urls"); Log.Information("Starting chatbot API..."); Log.Information($"API listening on {urls}"); Console.WriteLine("Application started. Press Ctrl+C to shut down."); CreateHostBuilder(args, configuration).Build().Run(); } catch (Exception ex) { Log.Fatal(ex, "Chatbot API host terminated unexpectedly"); } finally { Log.CloseAndFlush(); } } public static IHostBuilder CreateHostBuilder(string[] args, IConfiguration configuration) { var builder = Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup() .UseConfiguration(configuration); }); builder.UseSerilog(); return builder; } } }