@@ -15,10 +15,22 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API
1515{
1616 public class Program
1717 {
18- public static void Main ( string [ ] args )
18+ public static readonly string AppName = typeof ( Program ) . Namespace ;
19+ public static readonly string ShortAppName = AppName . Substring ( AppName . LastIndexOf ( '.' , AppName . LastIndexOf ( '.' ) - 1 ) + 1 ) ;
20+
21+ public static int Main ( string [ ] args )
1922 {
20- BuildWebHost ( args )
21- . MigrateDbContext < OrderingContext > ( ( context , services ) =>
23+ var configuration = GetConfiguration ( ) ;
24+
25+ Log . Logger = CreateSerilogLogger ( configuration ) ;
26+
27+ try
28+ {
29+ Log . Information ( "Configuring web host ({Application})..." , AppName ) ;
30+ var host = BuildWebHost ( configuration , args ) ;
31+
32+ Log . Information ( "Applying migrations ({Application})..." , AppName ) ;
33+ host . MigrateDbContext < OrderingContext > ( ( context , services ) =>
2234 {
2335 var env = services . GetService < IHostingEnvironment > ( ) ;
2436 var settings = services . GetService < IOptions < OrderingSettings > > ( ) ;
@@ -28,46 +40,66 @@ public static void Main(string[] args)
2840 . SeedAsync ( context , env , settings , logger )
2941 . Wait ( ) ;
3042 } )
31- . MigrateDbContext < IntegrationEventLogContext > ( ( _ , __ ) => { } )
32- . Run ( ) ;
43+ . MigrateDbContext < IntegrationEventLogContext > ( ( _ , __ ) => { } ) ;
44+
45+ Log . Information ( "Starting web host ({Application})..." , AppName ) ;
46+ host . Run ( ) ;
47+
48+ return 0 ;
49+ }
50+ catch ( Exception ex )
51+ {
52+ Log . Fatal ( ex , "Program terminated unexpectedly ({Application})!" , AppName ) ;
53+ return 1 ;
54+ }
55+ finally
56+ {
57+ Log . CloseAndFlush ( ) ;
58+ }
3359 }
3460
35- public static IWebHost BuildWebHost ( string [ ] args ) =>
36- WebHost . CreateDefaultBuilder ( args )
61+ private static IWebHost BuildWebHost ( IConfiguration configuration , string [ ] args ) =>
62+ WebHost . CreateDefaultBuilder ( args )
63+ . CaptureStartupErrors ( false )
3764 . UseStartup < Startup > ( )
65+ . UseApplicationInsights ( )
3866 . UseContentRoot ( Directory . GetCurrentDirectory ( ) )
39- . ConfigureAppConfiguration ( ( builderContext , config ) =>
40- {
41- var builtConfig = config . Build ( ) ;
67+ . UseConfiguration ( configuration )
68+ . UseSerilog ( )
69+ . Build ( ) ;
4270
43- var configurationBuilder = new ConfigurationBuilder ( ) ;
44-
45- if ( Convert . ToBoolean ( builtConfig [ "UseVault" ] ) )
46- {
47- configurationBuilder . AddAzureKeyVault (
48- $ "https://{ builtConfig [ "Vault:Name" ] } .vault.azure.net/",
49- builtConfig [ "Vault:ClientId" ] ,
50- builtConfig [ "Vault:ClientSecret" ] ) ;
51- }
71+ private static Serilog . ILogger CreateSerilogLogger ( IConfiguration configuration )
72+ {
73+ var seqServerUrl = configuration [ "Serilog:SeqServerUrl" ] ;
5274
53- configurationBuilder . AddEnvironmentVariables ( ) ;
75+ return new LoggerConfiguration ( )
76+ . MinimumLevel . Verbose ( )
77+ . Enrich . WithProperty ( "Application" , AppName )
78+ . Enrich . FromLogContext ( )
79+ . WriteTo . Console ( )
80+ . WriteTo . Seq ( string . IsNullOrWhiteSpace ( seqServerUrl ) ? "http://seq" : seqServerUrl )
81+ . ReadFrom . Configuration ( configuration )
82+ . CreateLogger ( ) ;
83+ }
5484
55- config . AddConfiguration ( configurationBuilder . Build ( ) ) ;
56- } )
57- . ConfigureLogging ( ( hostingContext , builder ) =>
58- {
59- builder . AddConfiguration ( hostingContext . Configuration . GetSection ( "Logging" ) ) ;
60- builder . AddConsole ( ) ;
61- builder . AddDebug ( ) ;
62- } )
63- . UseApplicationInsights ( )
64- . UseSerilog ( ( builderContext , config ) =>
65- {
66- config
67- . MinimumLevel . Information ( )
68- . Enrich . FromLogContext ( )
69- . WriteTo . Console ( ) ;
70- } )
71- . Build ( ) ;
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 ( ) ;
91+
92+ var config = builder . Build ( ) ;
93+
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 }
73- }
105+ }
0 commit comments