Как настроить журнал событий для.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"
}
}
}
}