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

时间:2019-07-08 20:05:54

标签: c# logging .net-core worker

我正在使用带有.NET Core 3.0预览版的新Worker Service应用程序模板,并尝试使用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>

服务已成功创建,我可以在“服务”查看器应用程序中看到它。从那里,我手动启动该服务,然后返回到“事件查看器”,没有显示日志。

我期望会有一些日志。但是,“ MyTestLog”部分在事件查看器中保持空白。

2 个答案:

答案 0 :(得分:1)

所以我能够找到报告为here的问题。

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

解决方法是仅将appsettings.json文件编辑为如下所示:

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

这将覆盖默认设置,并允许再次查看信息日志。

答案 1 :(得分:0)

我使用的是 .NET Core 3.1 和 Microsoft.Extensions.Logging 5.0.0。

这里发布的内容让我很接近,但并没有完全解决我的问题。即使我通过 ConfigureLogging 方法重置日志,日志仍列在“应用程序”日志名称下。

为了解决这个问题,我必须清除提供者。这对我来说似乎是 Microsoft.Extensions.Logging 的一个缺陷。

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