繁体   English   中英

.Net Core Worker Service 注入登录到 .Net 标准库类

[英].Net Core Worker Service Injecting logging into .Net Standard Library Class

我正在尝试将我的 Serilog Logger 注入 .NET Core Worker Service Project 中的 .Net Standard 2.0 库类。 但是,无论何时创建SetManager类,它都不会收到记录器。 (默认设置为空)因此,每当我尝试使用记录器时,都会得到一个值为空的错误。

任何人都可以帮忙吗? 下面的主机生成器

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
    .UseWindowsService()
    .ConfigureServices((hostContext, services) =>
    {
        IConfiguration configuration = hostContext.Configuration;
        ConfigDto configDto = configuration.GetSection("AppSettings").Get<ConfigDto>();
        services.AddSingleton(configDto);
        services.AddHostedService<Service>();
    })
    .UseSerilog();
}

Worker Project 中的类,它调用 SetManager,它是 .NET 标准库中的类。

public Service(ConfigDto config, ILogger<Service> logger = null)
{
    _logger = logger;
    _logger.LogTrace("Service object created");

    try
    {
        _logger.LogTrace("Getting config");
        _config = config;
    }
    catch (Exception ex)
    {
        _logger.LogCritical("Unable to load configuration. Stopping service:\n{0}", ex.Message);
        Stop();
    }
    _setManager = new SetManager(_config);
    _setManager.ReadyToProcess += SetManager_ReadyToProcess;
}

集合管理器构造函数

public SetManager(ConfigDto config, ILogger<SetManager> logger = null)
{
    _logger = logger;
    _config = config;
    _productList = GetProducts();

    _timer.Interval = 3000;
    _timer.Elapsed += Timer_Elapsed;
}

套餐

<PackageReference Include="Serilog.Enrichers.Thread" Version="3.1.0" /> 
<PackageReference Include="Serilog.Extensions.Hosting" Version="3.0.0" /> 
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" /> 
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" /> ` 

Service类可以很好地注入记录器。 它是不接收记录器的SetManager类。

在 Main 方法中设置 Serilog Logger。

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose() 
    .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) 
    .Enrich.With(new ThreadIdEnricher()) 
    .Enrich.FromLogContext() 
    .WriteTo.Console(LogEventLevel.Verbose, loggerTemplate, theme: AnsiConsoleTheme.Literate) 
    .WriteTo.File(logfile, LogEventLevel.Verbose, loggerTemplate, rollingInterval: RollingInterval.Day, retainedFileCountLimit: 90) 
    .CreateLogger();

Service 类可以很好地注入记录器。 它是不接收记录器的 Set Manager 类。

您正在手动创建SetManager

_setManager = new SetManager(_config);

使用带有默认(空)记录器的构造函数。

我建议明确地将经理注入服务工作者

public Service(SetManager manager, ILogger<Service> logger)
{
    _logger = logger;
    _logger.LogTrace("Service object created");

    try
    {
        _logger.LogTrace("configuring manager");            
        _setManager = manager;
        _setManager.ReadyToProcess += SetManager_ReadyToProcess;
    }
    catch (Exception ex)
    {
        _logger.LogCritical("Unable to load configuration. Stopping service:\n{0}", ex.Message);
        Stop();
    }
}

确保管理器也注册到具有适当生命周期范围的服务集合

这将允许在将管理器注入服务并遵循显式依赖原则时将正确的 Logger 注入管理器

如果 Logger 类对象为“null”,则无法访问它们的属性,因此您无法进行日志记录。 如果 logger 对象为 null 并且您想记录他,那么您可以使用其他来源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM