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

13

我正在使用.NET Core 3.0预览版的新工作器服务应用程序模板,并尝试使用AddEventLog方法添加事件日志记录。但是,我无法通过Windows事件查看器看到我的任何日志。

我有一个非常简单的工作器应用程序设置,并在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个回答

19

因此我能够找到这里报告的问题。

问题实质上归结于最新的.NET Core 3.0预览版中,事件日志现在默认情况下被过滤为警告级别。 因此,您无法看到任何信息日志。

解决方法只是简单地编辑appsettings.json文件,使其如下所示:

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

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


谢谢您的帖子。它确实解决了我的问题。但我遇到了一个小问题。我可以在WindowsLogs下看到日志,但在应用程序和服务日志部分却看不到。我期望会有一个新项目,但什么也没有创建。有什么想法吗? - Md Monjur Ul Hasan
我已经很久没有在这个环境下工作了,但我记得需要刷新我的日志才能看到所有的内容。此外,我肯定也记得在那些部分看到过日志。然而,那时候所有这些都是在预览中,所以可能有更多的变化。 - Jack Kinsey
它实际上是有效的。但是简单的刷新不起作用。相反,我需要重新启动事件日志应用程序才能看到它。感谢您的帮助。 - Md Monjur Ul Hasan

1
我正在使用.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"
      }
    }
  }
}

在 .NET 6 中解决了相同的问题。 - D'Arcy Rittich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接