【发布时间】:2022-07-06 23:09:54
【问题描述】:
按照有关如何使用 Serilog 的教程,我从 appsettings.json 文件中读取了设置 - 当事情很简单时,以下所有内容都运行良好:
主程序(简单 MVP 版本):
public static void Main(string[] args)
{
//Read Configuration from appSettings
var config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
//Initialize Logger
Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(config).CreateLogger();
try
{
Log.Information("Starting up the service");
CreateHostBuilder(args).Build().Run();
....
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
})
.UseSerilog();
然后是带有BackgroundService的类:
....
using Microsoft.Extensions.Logging;//and not Serilog!!
public class Worker : BackgroundService
{
private readonly ILogger _logger;
....
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
----------对我来说简单的事情到此结束:-) ----------------- ------------------
现在,我想从第一个 MVP 构建一个“真正的”程序 - 根据 SOLID 原则将函数放置在单独的类中。例如,我的第一个类是 ConfigurationCollector,从 appsettings.json 文件中收集所有相关参数我放在一个单独的班级。该类工作并完成工作 - 但我希望日志记录工作 - 我尝试使用跨类使用的所有已配置的 Serilog 记录器(就像我对 ILogger 所做的那样,以便 Worker 对象创建一个新的 ConfigurationCollector 类,如
public Worker(ILogger<Worker> logger)
{
_logger = logger;
_configCollector = new ConfigCollector(logger);
}
我知道 logger 现在是一种
ILogger<ConfigCollector>
不是
ILogger<Worker>
但是如何将服务启动时的原始 Serilog 注入到使用的每个类中,以便在日志中正确显示对象?
public class ConfigCollector
{
private readonly ILogger<ConfigCollector> _logger;
....
public ConfigCollector(ILogger<ConfigCollector> logger)
{
_logger = logger;
}
【问题讨论】:
标签: serilog background-service ilogger