为什么在Windows服务应用程序中会用serilog创建两个日志文件?

问题描述 投票:0回答:1

我有一个托管工作人员服务的 Windows 服务。

但是我有program.cs代码的日志和worker服务代码的其他文件。

我的代码是这样的:

程序.cs:

try
{
    Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);


    var builder = Host.CreateApplicationBuilder(args);



    builder.Services
        .AddSerilog(lc => lc.ReadFrom.Configuration(builder.Configuration))
        .AddHostedService<Worker>()
        .InstalarServicios(builder.Configuration);



    Log.Logger = new LoggerConfiguration()
                .ReadFrom.Configuration(builder.Configuration)
                .Enrich.FromLogContext()
                //.CreateBootstrapLogger()
                .CreateLogger()
                ;



    Log.Information("Aplicación iniciada.");





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

这是工人:

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;

    public Worker(ILogger<Worker> logger)
    {
        _logger = logger;
    }



    public override Task StartAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Servicio iniciado.");
        return base.StartAsync(cancellationToken);
    }
}

这是 .json 文件:

"Serilog": {
  "MinimumLevel": {
    "Default": "Information",
    "Override": {
      "Microsoft": "Information",
      "System": "Warning"
    }
  },

  "WriteTo": [
    {
      "Name": "File",
      "Args": {
        "path": "./logs/log-.txt",
        "rollingInterval": "Day"
      }
    },
    {
      "Name": "Seq",
      "Args": { "serverUrl": "http://localhost:5341" }
    }
  ]
}

如何将所有日志保存在一个唯一的文件中?

谢谢。

c# serilog
1个回答
1
投票

代码设置了两次 Serilog 日志记录。一旦与:

builder.Services
    .AddSerilog(lc => lc.ReadFrom.Configuration(builder.Configuration))

并使用以下命令创建一个新的静态记录器:

Log.Logger = new LoggerConfiguration()...

要在任何地方使用静态记录器,请使用

AddSerilog
UseSerilog
不带其他参数。 Serilog.Extensions.Hosting 包的登陆页面示例准确地显示了此用例:

using Serilog;

Log.Logger = new LoggerConfiguration()
    .Enrich.FromLogContext()
    .WriteTo.Console()
    .CreateLogger();

try
{
    Log.Information("Starting host");

    var builder = Host.CreateApplicationBuilder(args);
    builder.Services.AddHostedService<PrintTimeService>();
    builder.Services.AddSerilog();

    var app = builder.Build();
    
    await app.RunAsync();
    return 0;
}
catch (Exception ex)
{
    Log.Fatal(ex, "Host terminated unexpectedly");
    return 1;
}
finally
{
    await Log.CloseAndFlushAsync();
}

这在 AddSerilog(IServiceCollection,ILogger,bool,providers) 方法的 ILogger 参数帮助中提到:

  • logger:Serilog 记录器;如果未提供,将使用静态 Serilog.Log。
© www.soinside.com 2019 - 2024. All rights reserved.