簡體   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