// -------------------------------------------------------------------------------------------------------------------- // // Copyright(c) 2019 Dr. Peter Trimmel. All rights reserved. // // // Licensed under the MIT license. See the LICENSE file in the project root for more information. // // -------------------------------------------------------------------------------------------------------------------- namespace BaseClassLib { #region Using Directives using System; using System.Diagnostics; using System.Globalization; using System.Reflection; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Serilog; using CommandLine.Core.Hosting; using CommandLine.Core.Hosting.Abstractions; using McMaster.Extensions.CommandLineUtils; #endregion Using Directives /// /// Standardized main routine setting up a logger instance. /// /// The application program class. /// The application startup class. public class BaseProgram where TStartup : class, IStartup { #region Public Methods public async Task RunAsync(string[] args) { // Read the application settings file containing the Serilog configuration. var configuration = new ConfigurationBuilder() .SetBasePath(AppContext.BaseDirectory) .AddJsonFile("appsettings.json", false, false) .AddUserSecrets(true) .AddEnvironmentVariables() .Build(); // Setting up the static Serilog logger. Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration) .Enrich.FromLogContext() .CreateLogger(); // Set the default culture. CultureInfo.CurrentCulture = new CultureInfo("en-US"); try { // Create the application host. var app = CommandLineHost.CreateBuilder(args) .ConfigureAppConfiguration((config) => { config.SetBasePath(AppContext.BaseDirectory); config.AddJsonFile("appsettings.json", false, false); config.AddUserSecrets(true); config.AddEnvironmentVariables(); config.Build(); }) .ConfigureLogging((logger) => { logger.AddSerilog(); }) .UseStartup() .Build(); int code = 0; // Start the execution. Log.ForContext().Debug($"Executing '{Assembly.GetEntryAssembly().GetName().Name}{(args?.Length > 0 ? " " : "")}{string.Join(" ", args)}'."); Stopwatch stopWatch = new Stopwatch(); // Start the timer. stopWatch.Start(); code = await app.RunAsync(); // Display the timing info. stopWatch.Stop(); Log.ForContext().Debug($"Done."); Log.ForContext().Verbose($"Time elapsed {stopWatch.Elapsed}"); Console.WriteLine($"Time elapsed {stopWatch.Elapsed}"); return code; } catch (CommandParsingException cpx) { Console.WriteLine($"{cpx.Message}."); return -1; } catch (Exception ex) { Log.ForContext().Fatal(ex, "Application terminated unexpectedly"); return -1; } finally { Log.CloseAndFlush(); } } #endregion Public Methods } }