You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
4.3 KiB

6 years ago
  1. using Microsoft.AspNetCore;
  2. using Microsoft.AspNetCore.Hosting;
  3. using Microsoft.Extensions.Configuration;
  4. using Serilog;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Reflection;
  10. namespace WebStatus
  11. {
  12. public class Program
  13. {
  14. public static readonly string Namespace = typeof(Program).Namespace;
  15. public static readonly string AppName = Namespace;
  16. public static int Main(string[] args)
  17. {
  18. var configuration = GetConfiguration();
  19. Log.Logger = CreateSerilogLogger(configuration);
  20. try
  21. {
  22. Log.Information("Configuring web host ({ApplicationContext})...", AppName);
  23. var host = BuildWebHost(configuration, args);
  24. LogPackagesVersionInfo();
  25. Log.Information("Starting web host ({ApplicationContext})...", AppName);
  26. host.Run();
  27. return 0;
  28. }
  29. catch (Exception ex)
  30. {
  31. Log.Fatal(ex, "Program terminated unexpectedly ({ApplicationContext})!", AppName);
  32. return 1;
  33. }
  34. finally
  35. {
  36. Log.CloseAndFlush();
  37. }
  38. }
  39. private static IWebHost BuildWebHost(IConfiguration configuration, string[] args) =>
  40. WebHost.CreateDefaultBuilder(args)
  41. .CaptureStartupErrors(false)
  42. .ConfigureAppConfiguration(x => x.AddConfiguration(configuration))
  43. .UseStartup<Startup>()
  44. .UseContentRoot(Directory.GetCurrentDirectory())
  45. .UseSerilog()
  46. .Build();
  47. private static Serilog.ILogger CreateSerilogLogger(IConfiguration configuration)
  48. {
  49. var seqServerUrl = configuration["Serilog:SeqServerUrl"];
  50. var logstashUrl = configuration["Serilog:LogstashgUrl"];
  51. return new LoggerConfiguration()
  52. .MinimumLevel.Verbose()
  53. .Enrich.WithProperty("ApplicationContext", AppName)
  54. .Enrich.FromLogContext()
  55. .WriteTo.Console()
  56. .WriteTo.Seq(string.IsNullOrWhiteSpace(seqServerUrl) ? "http://seq" : seqServerUrl)
  57. .WriteTo.Http(string.IsNullOrWhiteSpace(logstashUrl) ? "http://logstash:8080" : logstashUrl)
  58. .ReadFrom.Configuration(configuration)
  59. .CreateLogger();
  60. }
  61. private static IConfiguration GetConfiguration()
  62. {
  63. var builder = new ConfigurationBuilder()
  64. .SetBasePath(Directory.GetCurrentDirectory())
  65. .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
  66. .AddEnvironmentVariables();
  67. var config = builder.Build();
  68. if (config.GetValue<bool>("UseVault", false))
  69. {
  70. builder.AddAzureKeyVault(
  71. $"https://{config["Vault:Name"]}.vault.azure.net/",
  72. config["Vault:ClientId"],
  73. config["Vault:ClientSecret"]);
  74. }
  75. return builder.Build();
  76. }
  77. private static string GetVersion(Assembly assembly)
  78. {
  79. try
  80. {
  81. return $"{assembly.GetCustomAttribute<AssemblyFileVersionAttribute>()?.Version} ({assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion.Split()[0]})";
  82. }
  83. catch
  84. {
  85. return string.Empty;
  86. }
  87. }
  88. private static void LogPackagesVersionInfo()
  89. {
  90. var assemblies = new List<Assembly>();
  91. foreach (var dependencyName in typeof(Program).Assembly.GetReferencedAssemblies())
  92. {
  93. try
  94. {
  95. // Try to load the referenced assembly...
  96. assemblies.Add(Assembly.Load(dependencyName));
  97. }
  98. catch
  99. {
  100. // Failed to load assembly. Skip it.
  101. }
  102. }
  103. var versionList = assemblies.Select(a => $"-{a.GetName().Name} - {GetVersion(a)}").OrderBy(value => value);
  104. Log.Logger.ForContext("PackageVersions", string.Join("\n", versionList)).Information("Package versions ({ApplicationContext})", AppName);
  105. }
  106. }
  107. }