Как настроить журнал событий для.NET Core 3.0 Worker Service

Я работаю с новым шаблоном приложения Worker Service с.NET Core 3.0 Preview и пытаюсь добавить ведение журнала событий, используя AddEventLog метод. Тем не менее, я не вижу ни одного из своих журналов через средство просмотра событий в Windows.

У меня очень простая настройка приложения Worker, и я настроил запись в Program.cs файл следующим образом:

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
    .UseWindowsService()
    .ConfigureLogging((context, logging) =>
    {
        logging.AddEventLog(new EventLogSettings()
        {
            SourceName = "MyTestSource",
            LogName = "MyTestLog"
        });
    })
    .ConfigureServices((hostContext, services) =>
    {
        services.AddHostedService<Worker>();
    });

Затем у меня есть некоторые записи журнала в Worker.cs файл следующим образом:

private readonly ILogger<Worker> _logger;

public Worker(ILogger<Worker> logger)
{
    _logger = logger;
}

public override async Task StartAsync(CancellationToken cancellationToken)
{
    _logger.LogInformation($"Worker started at: {DateTime.Now}");
    await base.StartAsync(cancellationToken);
}

public override async Task StopAsync(CancellationToken cancellationToken)
{
    _logger.LogInformation($"Worker stopped at: {DateTime.Now}");
    await base.StopAsync(cancellationToken);
}

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
    while (!stoppingToken.IsCancellationRequested)
    {
        _logger.LogInformation( $"Worker running at: {DateTime.Now}");
        await Task.Delay(1000, stoppingToken);
    }
}

Чтобы настроить журналы событий, я запустил следующее из командной строки Powershell с повышенными правами:

New-EventLog -LogName MyTestLog -Source MyTestSource

Если я открою "Просмотр событий", я вижу "MyTestLog", указанный ниже "Журналы приложений и служб".

Затем, чтобы настроить мой Worker в качестве службы Windows, я запустил следующие команды из командной строки с повышенными привилегиями:

dotnet publish -o publish (Публикует проект и выходные данные для публикации каталога)

sc create MyTestService binPath=<path to exe in publish directory>

Служба успешно создана, и я вижу ее в приложении просмотра служб. Оттуда я вручную запускаю службу, а затем возвращаюсь в Event Viewer, и журналы не отображаются.

Я ожидал, что там будут некоторые журналы. Тем не менее, раздел "MyTestLog" остается пустым в окне просмотра событий.

2 ответа

Таким образом, я смог найти проблему, о которой сообщалось здесь.

По сути, это сводится к изменению последней версии.NET Core 3.0 Preview, в которой журналы событий теперь фильтруются на уровне предупреждений по умолчанию. Таким образом, вы не можете видеть какие-либо информационные журналы.

Исправление было просто отредактировать appsettings.json файл выглядит следующим образом:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    },
    "EventLog": {
      "LogLevel": {
        "Default": "Information",
        "Microsoft.Hosting.Lifetime": "Information"
      }
    }
  }
}

Это переопределяет набор по умолчанию и позволяет снова просматривать журналы информации.

Я использую .NET Core 3.1 и Microsoft.Extensions.Logging 5.0.0.

То, что размещено здесь, меня близко, но не решило полностью мою проблему. Журналы все еще были перечислены под именем журнала «Приложение», даже несмотря на то, что я сбрасывал его с помощью метода ConfigureLogging.

Чтобы исправить это, мне пришлось очистить провайдеров. Мне это кажется дефектом с Microsoft.Extensions.Logging.

Приведенное ниже решение НЕ требует запуска сценария PowerShell, упомянутого в OP (New-EventLog -LogName MyTestLog -Source MyTestSource)

Рабочее решение для меня, больше ничего не требуется ...

Program.cs:

      public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
    .ConfigureLogging(logging =>
    {
        logging.ClearProviders();
        logging.AddConsole();
    
        logging.AddEventLog(new EventLogSettings()
        {
            LogName = "TSEServiceLog",
            SourceName = "TestSavvyExecuteService"
        });
    })
    .ConfigureServices((hostContext, services) =>
    {
        services.AddHostedService<Worker>();
    })
    .UseWindowsService();

appsettings.json:

      {
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    },
    "EventLog": {
      "LogLevel": {
        "Default": "Information",
        "Microsoft.Hosting.Lifetime": "Information"
      }
    }
  }
}
Другие вопросы по тегам