简体   繁体   English

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

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

I'm trying to inject my Serilog Logger into a .Net Standard 2.0 library class from a .NET Core Worker Service Project.我正在尝试将我的 Serilog Logger 注入 .NET Core Worker Service Project 中的 .Net Standard 2.0 库类。 However whenever the SetManager class is created, it is receiving no logger.但是,无论何时创建SetManager类,它都不会收到记录器。 (The default is set to null) Therefore I get a value is null error whenever I try use the logger. (默认设置为空)因此,每当我尝试使用记录器时,都会得到一个值为空的错误。

Can anyone help?任何人都可以帮忙吗? Host Builder Below下面的主机生成器

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

Class in Worker Project that calls SetManager which is the Class in the .NET Standard Library. 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;
}

SetManager Constructor集合管理器构造函数

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

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

Packages套餐

<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" /> ` 

The Service class gets the logger injected fine. Service类可以很好地注入记录器。 Its the SetManager class that doesn't receive the logger.它是不接收记录器的SetManager类。

Serilog Logger setup in Main method.在 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();

The Service class gets the logger injected fine. Service 类可以很好地注入记录器。 Its the Set Manager class that doesn't receive the logger.它是不接收记录器的 Set Manager 类。

You are manually creating the SetManager您正在手动创建SetManager

_setManager = new SetManager(_config);

using the constructor with the default (null) logger.使用带有默认(空)记录器的构造函数。

I would suggest explicitly injecting the manager into the service worker我建议明确地将经理注入服务工作者

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

Making sure that the manager is also registered with the service collection with an appropriate lifetime scope确保管理器也注册到具有适当生命周期范围的服务集合

This will allow the correct Logger to be injected into the manager when the manager is injected into the service and follows the Explicit Dependencies Principle这将允许在将管理器注入服务并遵循显式依赖原则时将正确的 Logger 注入管理器

If the Logger class object is "null" then can't access their properties so that you can't log.如果 Logger 类对象为“null”,则无法访问它们的属性,因此您无法进行日志记录。 If logger object is null and you want to log him then you can use another source.如果 logger 对象为 null 并且您想记录他,那么您可以使用其他来源。

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

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