如何设置.NET Core 3.0 Worker服务的事件日志



我正在使用带有.NET Core 3.0预览的新工作服务应用模板,并尝试使用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>();
    });

i然后在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"应用程序和服务日志"。

然后,要设置我的工人作为Windows服务,我从高架命令提示符中运行以下命令:

dotnet publish -o publish(发布项目和输出以发布目录(

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

该服务是成功创建的,我可以在服务查看器应用程序中看到它。从那里,我手动启动服务,然后在活动查看器中查看,并且没有显示日志。

我希望有一些日志。但是," mytestlog"部分在事件查看器中仍然是空的。

,所以我能够在此处找到该问题。

本质上,它归结为最新的.NET Core 3.0预览的更改,其中默认情况下,事件日志在警告级别上过滤。因此,您看不到任何信息日志。

修复程序是简单地编辑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。

这里发布的内容使我接近,但没有完全解决我的问题。日志仍在"应用"下列出。即使通过我通过configuroLogging方法将其重置。

为了解决此问题,我必须清除提供商。对于我来说,这似乎是我的缺陷。

下面的解决方案不需要运行OP中提到的PowerShell脚本(new -esventlog -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"
      }
    }
  }
}

最新更新