. Net Core Worker Service. Внедрение входа в систему. Net Стандартный класс библиотеки - PullRequest
1 голос
/ 05 марта 2020

Я пытаюсь внедрить мой Serilog Logger в. Net Стандартный класс библиотеки 2.0 из. NET Core Worker Service Project. Однако всякий раз, когда создается класс SetManager, он не получает регистратор. (По умолчанию установлено значение null). Поэтому я получаю значение null error всякий раз, когда я пытаюсь использовать регистратор.

Кто-нибудь может помочь? Host Builder ниже

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

Класс в рабочем проекте, который вызывает 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

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, который не получает регистратор.

Настройка Serilog Logger в методе Main.

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

Ответы [ 2 ]

2 голосов
/ 05 марта 2020

Класс 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();
    }
}

Убедиться, что менеджер также зарегистрирован в собрании служб с соответствующей областью действия времени жизни

Это позволит вводить правильное средство ведения журнала в менеджер, когда менеджер вводится в службу и следует принципу явных зависимостей

0 голосов
/ 05 марта 2020

Если объект класса Logger имеет значение «null», он не может получить доступ к их свойствам, поэтому вы не можете войти в систему. Если объект logger нулевой и вы хотите его зарегистрировать, вы можете использовать другой источник.

...