You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
}

关键修改点说明

  1. 移除重复的Serilog配置:删除原代码中builder.Services.AddSerilog(lc => lc.ReadFrom.Configuration(builder.Configuration))一行,避免创建第二个Serilog实例。
  2. 统一使用全局Logger:通过builder.Host.UseSerilog()让Host所有组件(包括Worker中注入的ILogger<Worker>)复用已初始化的全局Log.Logger实例,确保所有日志输出到同一个文件。
  3. 显式加载配置文件:初始化Logger时显式构建Configuration并指定配置文件路径,避免因环境差异导致的配置读取问题。

原有Serilog配置文件无需修改,保持原样即可。

内容的提问来源于stack exchange,提问作者Álvaro García

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 02:56:30