【问题标题】:Start logging before webhost in ASP.NET Core 2在 ASP.NET Core 2 中的 webhost 之前开始记录
【发布时间】:2018-08-28 14:41:46
【问题描述】:

我想在 webhost 之前开始记录,因此会记录启动错误。所以我跟着Serilog's recommended init order:1)配置,2)日志,3)网络主机。我没有使用CreateDefaultBuilder()

所以我的Program.cs 有:

// setup config
var envName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production";
var configuration = new ConfigurationBuilder()
  .SetBasePath(Directory.GetCurrentDirectory())
  .AddJsonFile("appsettings.json", optional:false, reloadOnChange:true)
  .AddJsonFile($"appsettings.{envName}.json", optional:true, reloadOnChange:true)
  .AddEnvironmentVariables()
  .AddCommandLine(args)
  .Build();

// setup Serilog logging
Log.Logger = new LoggerConfiguration()
  .ReadFrom.Configuration(configuration)            // <<< uses config from above
  .CreateLogger()

// setup webhost
new WebHostBuilder()
  .UseConfiguration(configuration)                  // <<< uses config from above
  .UseKestrel()
  .UseContentRoot(Directory.GetCurrentDirectory())
  .UseStartup<Startup>()
  .UseSerilog()
  .Build()
  .Run();

这可行,但即使我指定了reloadOnChange:true,也未检测到appsettings.json 的更改。

但是,当我使用 ConfigureAppConfiguration() 时,会检测到更改:

new WebHostBuilder()
  .ConfigureAppConfiguration((context, config) => {
    // .. duplicate config here
  })
  .UseKestrel()
  .UseContentRoot(Directory.GetCurrentDirectory())
  .UseStartup<Startup>()
  .UseSerilog()
  .Build()
  .Run();

但这意味着重复和可能无法预料的问题 - 即这是一个 hack。 我该如何解决这个问题?

更新

根据@StephenZeng 的回答,UseConfiguration 在这里帮不了我,所以我想我需要使用ConfigureAppConfiguration。但问题依然存在——如何先初始化配置,然后多次使用而不重新定义?

【问题讨论】:

    标签: c# asp.net-core serilog asp.net-core-2.1


    【解决方案1】:

    从文档来看,这是设计使然:

    “UseConfiguration 仅将提供的 IConfiguration 中的密钥复制到主机构建器配置。因此,对 JSON、INI 和 XML 设置文件设置 reloadOnChange: true 无效。”

    https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/web-host?view=aspnetcore-2.1&tabs=aspnetcore2x

    【讨论】:

    • 谢谢 - 他们经常更改文档,我没有看到。尽管如此,问题仍然存在,如何在不复制配置代码的情况下使用ConfigureAppConfiguration
    【解决方案2】:

    我遇到了同样的问题,我创建了一个负责配置构建器的方法。然后我从Main 和构建网络主机时调用该方法。像这样的:

    public static class Program
    {
      public static int Main()
      {
        var configuration = new ConfigurationBuilder()
          .AddConfiguration()
          .Build();
    
        // setup Serilog logging
        Log.Logger = new LoggerConfiguration()
          .ReadFrom.Configuration(configuration)
          .CreateLogger();
    
        // Code removed for brevity...
      }
    
      private static IWebHost BuildWebHost() =>
        WebHost.CreateDefaultBuilder()
          .UseSerilog()
          .UseStartup<Startup>()
          .ConfigureAppConfiguration((hostingContext, config) =>
          {
            // Clear default configuration
            config.Sources.Clear();
    
            // Replace with our own configuration
            config.AddConfiguration();
          })
          .Build();
    
      private static IConfigurationBuilder AddConfiguration(this IConfigurationBuilder self) =>
        self
          .SetBasePath(Directory.GetCurrentDirectory())
          .AddJsonFile("appsettings.json", optional:false, reloadOnChange:true)
          .AddJsonFile($"appsettings.{envName}.json", optional:true, reloadOnChange:true)
          .AddEnvironmentVariables();
    }
    

    【讨论】:

    • 为什么需要config.Sources.Clear()?里面有默认的吗?
    • 是的,那里有东西。对CreateDefaultBuilder() 的调用会添加默认配置。您可以尝试将其排除在外,如果对您有用,请不要先清除它。
    • 哦,好吧,我不使用CreateDefaultBuilder(),所以我没有看到任何内容。
    【解决方案3】:

    解决方案是避免使用UseConfiguration,而是使用ConfigureAppConfiguration

    // setup config
    // ..as before
    // ..this is done only once
    
    // setup Serilog logging
    // ...as before
    
    // setup webhost
    new WebHostBuilder()
      .ConfigureAppConfiguration((context, config) => {
        config.AddConfiguration(configuration);  // <<< uses config from above
      })
      .UseKestrel()
      .UseContentRoot(Directory.GetCurrentDirectory())
      .UseStartup<Startup>()
      .UseSerilog()
      .Build()
      .Run();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多