Windows Service中Serilog生成双日志文件,如何合并为单个文件?
解决方案:合并Worker Service与Program.cs的日志到单个文件
问题根源在于代码中重复初始化了Serilog实例:Program.cs手动创建了Log.Logger全局实例,同时通过builder.Services.AddSerilog(...)又为DI容器创建了另一个独立的Serilog实例,导致Worker注入的ILogger<Worker>和Program.cs直接使用的Log.Logger各自输出到不同文件。
只需修改Program.cs代码,统一使用全局Serilog实例即可解决:
修改后的Program.cs代码
try { Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory); // 先初始化全局Serilog Logger Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(new ConfigurationBuilder() .SetBasePath(AppDomain.CurrentDomain.BaseDirectory) .AddJsonFile("appsettings.json") .Build()) .Enrich.FromLogContext() .CreateLogger(); Log.Information("Aplicación iniciada."); var builder = Host.CreateApplicationBuilder(args); // 让整个Host环境使用全局的Serilog实例 builder.Host.UseSerilog(); builder.Services .AddHostedService<Worker>() .InstalarServicios(builder.Configuration); var host = builder.Build(); await host.RunAsync(); } catch(Exception ex) { Log.Fatal(ex, "Se ha producido un error en la aplicación y se cerrará."); } finally { Log.Information("Aplicación finalizada."); Log.CloseAndFlush(); }
关键修改点说明
- 移除重复的Serilog配置:删除原代码中
builder.Services.AddSerilog(lc => lc.ReadFrom.Configuration(builder.Configuration))一行,避免创建第二个Serilog实例。 - 统一使用全局Logger:通过
builder.Host.UseSerilog()让Host所有组件(包括Worker中注入的ILogger<Worker>)复用已初始化的全局Log.Logger实例,确保所有日志输出到同一个文件。 - 显式加载配置文件:初始化Logger时显式构建Configuration并指定配置文件路径,避免因环境差异导致的配置读取问题。
原有Serilog配置文件无需修改,保持原样即可。
内容的提问来源于stack exchange,提问作者Álvaro García
相关产品推荐
相关产品推荐

