使用 Serilog 时如何覆盖 appsettings.json 中指定的应用程序名称?
How to overwrite application name specified in appsettings.json when using Serilog?
我的 appsettings.json 看起来像这样:
{
"Serilog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "%APPDATA%\FancyProject\logs\RR.log",
"formatter": "Serilog.Formatting.Json.JsonFormatter",
"rollingInterval": "Day",
"retainedFileCountLimit": 20,
"buffered": false
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId", "WithExceptionDetails" ],
"Properties": {
"Application": "SampleName"
}
}
}
正在加载设置:
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
我想在我的解决方案中为多个项目使用相同的配置文件,但使用不同的应用程序名称以区分服务。
有没有办法在加载配置时在代码中更改应用程序名称("SampleName" 在我的配置中)?
从appsettings.json
读取配置实例后,您可以使用IConfiguration
接口的以下扩展方法来更新配置实例
public static class Ext
{
public static IConfiguration ApplyAppName(this IConfiguration configuration, string appName)
{
foreach (var (key, _) in configuration.AsEnumerable())
if (key.StartsWith("Serilog") && key.EndsWith("Application"))
configuration[key] = appName;
return configuration;
}
}
并按以下方式使用它(基于
serilog-settings-configuration 来自 GitHub 的示例)在配置和创建记录器之前
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build()
.ApplyAppName("MyApp");
var logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
或者,您可以按照 Serilog integration for ASP.NET Core 2+ 并在 CreateHostBuilder
调用
期间使用带有上述 ApplyAppName
扩展名的 UseSerilog()
方法
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); })
.UseSerilog((hostingContext, loggerConfiguration) =>
{
var config = hostingContext.Configuration.ApplyAppName("MyApp");
loggerConfiguration.ReadFrom.Configuration(config);
});
我通过从配置中删除属性部分并以这种方式加载它来解决它:
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.Enrich.WithProperty("ApplicationName", "my application")
.CreateLogger();
PavelAnikhouski(已删除)的回答实际上是我问题的正确答案,但我认为直接添加正确的应用程序名称比修改占位符更简洁。
我的 appsettings.json 看起来像这样:
{
"Serilog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "%APPDATA%\FancyProject\logs\RR.log",
"formatter": "Serilog.Formatting.Json.JsonFormatter",
"rollingInterval": "Day",
"retainedFileCountLimit": 20,
"buffered": false
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId", "WithExceptionDetails" ],
"Properties": {
"Application": "SampleName"
}
}
}
正在加载设置:
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
我想在我的解决方案中为多个项目使用相同的配置文件,但使用不同的应用程序名称以区分服务。
有没有办法在加载配置时在代码中更改应用程序名称("SampleName" 在我的配置中)?
从appsettings.json
IConfiguration
接口的以下扩展方法来更新配置实例
public static class Ext
{
public static IConfiguration ApplyAppName(this IConfiguration configuration, string appName)
{
foreach (var (key, _) in configuration.AsEnumerable())
if (key.StartsWith("Serilog") && key.EndsWith("Application"))
configuration[key] = appName;
return configuration;
}
}
并按以下方式使用它(基于 serilog-settings-configuration 来自 GitHub 的示例)在配置和创建记录器之前
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build()
.ApplyAppName("MyApp");
var logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
或者,您可以按照 Serilog integration for ASP.NET Core 2+ 并在 CreateHostBuilder
调用
ApplyAppName
扩展名的 UseSerilog()
方法
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); })
.UseSerilog((hostingContext, loggerConfiguration) =>
{
var config = hostingContext.Configuration.ApplyAppName("MyApp");
loggerConfiguration.ReadFrom.Configuration(config);
});
我通过从配置中删除属性部分并以这种方式加载它来解决它:
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.Enrich.WithProperty("ApplicationName", "my application")
.CreateLogger();
PavelAnikhouski(已删除)的回答实际上是我问题的正确答案,但我认为直接添加正确的应用程序名称比修改占位符更简洁。