[英]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.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.