我有一个托管工作人员服务的 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" }
}
]
}
如何将所有日志保存在一个唯一的文件中?
谢谢。
代码设置了两次 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。