簡體   English   中英

Serilog 使用 appsettings.json 而不是 appsettings.Development.json

[英]Serilog using appsettings.json instead of appsettings.Development.json

我正在為 .NET 5 Worker 服務設置 Serilog,並在本地運行它。 一切都按預期工作,然后我將 launchSettings.json 中的“DOTNET_ENIVORNMENT”環境變量從“Development”更改為“asdf”,以使用 appsettings.json 配置而不是 appsettings.Development.json 進行測試。 一切都按預期工作。 但是現在我已將該環境變量改回“開發”,Serilog 仍在使用來自 appsettings.json 的設置。

我將兩個 appsettings 文件都設置為始終復制到輸出目錄。

<ItemGroup>
    <Content Update="appsettings.Development.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Update="appsettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

這是我當前的 launchSettings.json 文件。

{
  "profiles": {
    "MyMicroservice": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "environmentVariables": {
        "DOTNET_ENVIRONMENT": "Development"
      }
    }
  }
}

當我運行程序時,Serilog 只寫入一個文件,而不是 2 個文件和控制台。 但是,我將 WorkerSettings 配置傳遞給我的 Worker.cs 類,它從 appsettings.Development.json 獲取 5 秒的“TaskInterval”設置。 為什么 Serilog 不使用 appsettings.Development.json 中的配置?

下面是我的 appsettings 文件和 Program.cs 文件。

appsettings.Development.json - 我設置 Serilog 設置以寫入控制台和 2 個文件。 我還創建了一個設置“TaskInterval”設置為 5 秒。

{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Information",
        "System": "Warning"
      }
    },
    "WriteTo": [
      { "Name": "Console" },
      {
        "Name": "File",
        "Args": {
          "path": "C:/temp/MyMicroservice/HealthCheck.txt",
          "outputTemplate": "{Timestamp:o} [{Level:u3}] ({Application}/{MachineName}/{ThreadId}) {Message}{NewLine}{Exception}",
          "rollingInterval": "Day"
        }
      }
    ],
    "WriteTo:Async": {
      "Name": "Async",
      "Args": {
        "configure": [
          {
            "Name": "File",
            "Args": {
              "path": "%TEMP%/MyMicroservice/HealthCheck.txt",
              "outputTemplate": "{Timestamp:o} [{Level:u3}] ({Application}/{MachineName}/{ThreadId}) {Message}{NewLine}{Exception}",
              "rollingInterval": "Day"
            }
          }
        ]
      }
    },
    "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]
  },
  "WorkerSettings": {
    "TaskInterval": 5000
  }
}

appsettings.json - 我將 Serilog 設置設置為僅寫入 1 個文件。 這次我將“TaskInterval”設置為 10 秒。

{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Information",
        "System": "Warning"
      }
    },
    "WriteTo:Async": {
      "Name": "Async",
      "Args": {
        "configure": [
          {
            "Name": "File",
            "Args": {
              "path": "%TEMP%/MyMicroservice/HealthCheck.txt",
              "outputTemplate": "{Timestamp:o} [{Level:u3}] ({Application}/{MachineName}/{ThreadId}) {Message}{NewLine}{Exception}",
              "rollingInterval": "Day"
            }
          }
        ]
      }
    },
    "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]
  },
  "WorkerSettings": {
    "TaskInterval": 10000
  }
}

程序.cs

public static class Program
    {
        public static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder();
            BuildConfig(builder);

            Log.Logger = new LoggerConfiguration()
                .ReadFrom.Configuration(builder.Build())
                .CreateLogger();

            try
            {
                Log.Information("Starting up {Service}.", nameof(MyMicroservice));
                CreateHostBuilder(args).Build().Run();
            }
            catch (Exception ex)
            {
                Log.Fatal(ex, "There was a problem starting {Service}.", nameof(MyMicroservice));
            }
            finally
            {
                Log.Information("Ending {Service}.", nameof(MyMicroservice));
                Log.CloseAndFlush();
            }
        }

        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            return Host.CreateDefaultBuilder(args)
                        .ConfigureServices((hostContext, services) =>
                        {
                            services.AddOptions<WorkerSettings>().Bind(hostContext.Configuration.GetSection(nameof(WorkerSettings)));
                            //services.Configure<Settings>(hostContext.Configuration.GetSection(nameof(Settings)));
                            services.AddHostedService<Worker>();
                        })
                        .UseSerilog();
        }

        static void BuildConfig(IConfigurationBuilder builder)
        {
            builder.SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"apsettings.{Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT") ?? "Production"}.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables();
        }
    }

這對我有用:

            var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
            var isDevelopment = environmentName == "Development";
            var configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: isDevelopment)
                .AddJsonFile($"appsettings.{environmentName}.json", true, isDevelopment)
                .Build();

            Log.Logger = new LoggerConfiguration()
                .ReadFrom.Configuration(configuration)
                .CreateBootstrapLogger();

            CreateHostBuilder(args, configuration)
                .Build()
                .Run();
...


    private static IHostBuilder CreateHostBuilder(string[] args, IConfiguration configuration) =>
        Host.CreateDefaultBuilder(args)
            .UseSerilog((hostingContext, services, loggerConfiguration) =>
            {
                loggerConfiguration.ReadFrom.Configuration(configuration);
                loggerConfiguration.ReadFrom.Services(services);
                loggerConfiguration.Enrich.FromLogContext();
            })

.Net6:DOTNET_ENVIRONMENT

包:Serilog.Settings.Configuration

var environmentName = Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT");

var configuration = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile($"appsettings.{environmentName}.json")
    .Build();

Log.Logger = new LoggerConfiguration()
     .ReadFrom.Configuration(configuration)
     .CreateLogger();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM