C# .NET Core 3.1 BackgroundService 中的 Serilog 使用
在了解如何使用 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);
}
我知道的那样) 一种类型
ILogger<ConfigCollector>
logger 现在不是
ILogger<Worker>
,但是如何将服务启动时的原始 Serilog 注入到使用的每个类中,以便对象在日志中正确显示?
public class ConfigCollector
{
private readonly ILogger<ConfigCollector> _logger;
....
public ConfigCollector(ILogger<ConfigCollector> logger)
{
_logger = logger;
}
Following a tutorial on how to use Serilog I read the settings from an appsettings.json file - and all below works well, when things are simple:
Main program (in simple MVP version):
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();
Then the class with the BackgroundService:
....
using Microsoft.Extensions.Logging;//and not Serilog!!
public class Worker : BackgroundService
{
private readonly ILogger _logger;
....
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
---------------------SIMPLE THINGS FOR ME ENDS HERE :-) ----------------------------------
Now, I want to build it up to a "real" program from this first MVP - placing function in seperate classes according to SOLID principles.For instance my first class is a ConfigurationCollector collecting all relevant paramters from the appsettings.json file that I place in a seperat class. The class works and does it jobs - but I want logging to work - and I try to use the allready configured Serilog logger used accross class (just as I did with ILogger, so that the Worker object creates a new ConfigurationCollector class like
public Worker(ILogger<Worker> logger)
{
_logger = logger;
_configCollector = new ConfigCollector(logger);
}
I know that logger is now a type of
ILogger<ConfigCollector>
which is not
ILogger<Worker>
But how do I inject the original Serilog from the initiation of the service into each class used, such that the objects are shown properly in the logs?
public class ConfigCollector
{
private readonly ILogger<ConfigCollector> _logger;
....
public ConfigCollector(ILogger<ConfigCollector> logger)
{
_logger = logger;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
.NET 6 后台服务
.NET 6 Background service