99using Serilog ;
1010using System ;
1111using System . IO ;
12+
1213namespace Microsoft . eShopOnContainers . Services . Catalog . API
1314{
1415 public class Program
1516 {
16- public static void Main ( string [ ] args )
17+ private static readonly string ApplicationName = typeof ( Program ) . Namespace ;
18+
19+ public static int Main ( string [ ] args )
1720 {
18- BuildWebHost ( args )
19- . MigrateDbContext < CatalogContext > ( ( context , services ) =>
21+ var configuration = GetConfiguration ( ) ;
22+
23+ Log . Logger = CreateSerilogLogger ( configuration ) ;
24+
25+ try
26+ {
27+ Log . Information ( "Configuring web host ({Application})..." , ApplicationName ) ;
28+ var host = BuildWebHost ( configuration , args ) ;
29+
30+ Log . Information ( "Applying migrations ({Application})..." , ApplicationName ) ;
31+ host . MigrateDbContext < CatalogContext > ( ( context , services ) =>
2032 {
2133 var env = services . GetService < IHostingEnvironment > ( ) ;
2234 var settings = services . GetService < IOptions < CatalogSettings > > ( ) ;
2335 var logger = services . GetService < ILogger < CatalogContextSeed > > ( ) ;
2436
2537 new CatalogContextSeed ( )
26- . SeedAsync ( context , env , settings , logger )
38+ . SeedAsync ( context , env , settings , logger )
2739 . Wait ( ) ;
28-
2940 } )
30- . MigrateDbContext < IntegrationEventLogContext > ( ( _ , __ ) => { } )
31- . Run ( ) ;
41+ . MigrateDbContext < IntegrationEventLogContext > ( ( _ , __ ) => { } ) ;
42+
43+ Log . Information ( "Starting web host ({Application})..." , ApplicationName ) ;
44+ host . Run ( ) ;
45+
46+ return 0 ;
47+ }
48+ catch ( Exception ex )
49+ {
50+ Log . Fatal ( ex , "Program terminated unexpectedly ({Application})!" , ApplicationName ) ;
51+ return 1 ;
52+ }
53+ finally
54+ {
55+ Log . CloseAndFlush ( ) ;
56+ }
3257 }
3358
34- public static IWebHost BuildWebHost ( string [ ] args ) =>
59+ private static IWebHost BuildWebHost ( IConfiguration configuration , string [ ] args ) =>
3560 WebHost . CreateDefaultBuilder ( args )
36- . UseStartup < Startup > ( )
61+ . CaptureStartupErrors ( false )
62+ . UseStartup < Startup > ( )
3763 . UseApplicationInsights ( )
3864 . UseContentRoot ( Directory . GetCurrentDirectory ( ) )
3965 . UseWebRoot ( "Pics" )
40- . ConfigureAppConfiguration ( ( builderContext , config ) =>
41- {
42- var builtConfig = config . Build ( ) ;
66+ . UseConfiguration ( configuration )
67+ . UseSerilog ( )
68+ . Build ( ) ;
69+
70+ private static Serilog . ILogger CreateSerilogLogger ( IConfiguration configuration )
71+ {
72+ var seqServerUrl = configuration [ "Serilog:SeqServerUrl" ] ;
4373
44- var configurationBuilder = new ConfigurationBuilder ( ) ;
74+ return new LoggerConfiguration ( )
75+ . MinimumLevel . Verbose ( )
76+ . Enrich . WithMachineName ( )
77+ . Enrich . WithProperty ( "Application" , ApplicationName )
78+ . Enrich . FromLogContext ( )
79+ . WriteTo . Console ( )
80+ . WriteTo . Seq ( string . IsNullOrWhiteSpace ( seqServerUrl ) ? "http://seq" : seqServerUrl )
81+ . ReadFrom . Configuration ( configuration )
82+ . CreateLogger ( ) ;
83+ }
4584
46- if ( Convert . ToBoolean ( builtConfig [ "UseVault" ] ) )
47- {
48- configurationBuilder . AddAzureKeyVault (
49- $ "https://{ builtConfig [ "Vault:Name" ] } .vault.azure.net/",
50- builtConfig [ "Vault:ClientId" ] ,
51- builtConfig [ "Vault:ClientSecret" ] ) ;
52- }
85+ private static IConfiguration GetConfiguration ( )
86+ {
87+ var builder = new ConfigurationBuilder ( )
88+ . SetBasePath ( Directory . GetCurrentDirectory ( ) )
89+ . AddJsonFile ( "appsettings.json" , optional : false , reloadOnChange : true )
90+ . AddEnvironmentVariables ( ) ;
5391
54- configurationBuilder . AddEnvironmentVariables ( ) ;
92+ var config = builder . Build ( ) ;
5593
56- config . AddConfiguration ( configurationBuilder . Build ( ) ) ;
57- } )
58- . ConfigureLogging ( ( hostingContext , builder ) =>
59- {
60- builder . AddConfiguration ( hostingContext . Configuration . GetSection ( "Logging" ) ) ;
61- builder . AddConsole ( ) ;
62- builder . AddDebug ( ) ;
63- } )
64- . UseSerilog ( ( builderContext , config ) =>
65- {
66- config
67- . MinimumLevel . Information ( )
68- . Enrich . FromLogContext ( )
69- . WriteTo . Console ( ) ;
70- } )
71- . Build ( ) ;
94+ if ( config . GetValue < bool > ( "UseVault" , false ) )
95+ {
96+ builder . AddAzureKeyVault (
97+ $ "https://{ config [ "Vault:Name" ] } .vault.azure.net/",
98+ config [ "Vault:ClientId" ] ,
99+ config [ "Vault:ClientSecret" ] ) ;
100+ }
101+
102+ return builder . Build ( ) ;
103+ }
72104 }
73105}
0 commit comments