c# - 在 .NET Core 2.1 中重新加载 Serilog JSON 配置
问题描述
我目前正在开发一个 ASP.NET Core 2.1 应用程序,我使用 Serilog 进行日志记录。我想在运行时为我的 Serilog 实现重新加载应用程序设置文件。
我的目标是在运行时更改日志级别,例如我写入 minimumLevel Debug而不是Information并保存文件。我想触发设置的实时重新加载。我的appsettings.json
样子是这样的:
{
"serilog": {
"using": [ "Serilog.Sinks.File", "Serilog.Sinks.Console" ],
"minimumLevel": "Information",
"writeTo": [
{
"name": "File",
"args": {
"fileSizeLimitBytes": 256000000,
"retainedFileCountLimit": 62,
"rollingInterval": "Day",
"rollOnFileSizeLimit": true,
},
{
"name": "Console",
}
]
}
}
在我的Program.cs中,我使用 flag 加载设置reloadOnChange: true
。
public class Program
{
public static readonly ServiceSettings Settings = new ServiceSettings();
public static void Main(string[] args)
{
//...
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(Path.GetFullPath(CoreServiceBase.Instance.ConfigFilePath), optional: false, reloadOnChange: true)
.AddCommandLine(args)
.Build();
config.Bind(Settings);
return WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseSerilog((hostingContext, loggerConfiguration) =>
loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration))
.UseConfiguration(config);
}
}
我的启动看起来像这样:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
// ...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// Custom application logging
ApplicationLogging.LoggerFactory = loggerFactory;
// ...
}
}
如果我以某种方式更改了 appsettings.json,您是否知道如何在运行时重新加载 Serilog 配置。=> appsettings.json 的实时重新加载。
谢谢!!
解决方案
您可以使用Serilog.Settings.Reloader
我没有 ASP 示例,但在控制台程序上你可以这样做:
// Service collection
IServiceCollection serviceCollection = new ServiceCollection()
.AddLogging(loggingBuilder =>
loggingBuilder
.AddSerilog(SwitchableLogger.Instance, true)
.AddSerilogConfigurationLoader(configuration, SwitchableLogger.Instance)
);
// Services
using (var services = serviceCollection.BuildServiceProvider())
{
// Create logger
Microsoft.Extensions.Logging.ILogger logger = services.GetService<Microsoft.Extensions.Logging.ILogger<Program>>();
// Write
logger.LogInformation("Hello World");
// Modify config
config.Set("Serilog:WriteTo:0:Args:OutputTemplate", "[{SourceContext}] {Message:lj}{NewLine}{Exception}");
configuration.Reload();
// Write with the previous logger instance, but with different settings
logger.LogInformation("Hello world again");
}
推荐阅读
- java - 在 android 10 和 11 中,如何在使用范围存储访问框架时从 URI 获取真实文件路径
- batch-file - 将包含某些数字的 PDF 移动到包含相同数字的文件夹中的批处理
- javascript - 如何检测 Discord 中的内联回复?
- arrays - 比较 3 个数组
- php - 如何在 Wordpress 中手动显示即将发布和最近发布的帖子
- ruby-on-rails - Rails left_outer_joins 多个条件
- javascript - 本地(插图画家)上的图像高度相同,但加载时大小不同
- sql - 这个 oracle 查询中的 {0} 是什么意思“select ... from STAFFSV {0} order by SEQID”?
- javascript - Vue3组合api从手表处理程序访问组件方法
- python - 为 scipy 距离函数提供填充值