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

Posted

技术标签:

【中文标题】如何为 .NET Core 3.0 Worker 服务设置事件日志【英文标题】:How to setup event log for .NET Core 3.0 Worker Service 【发布时间】:2019-11-18 09:08:08 【问题描述】:

我正在使用带有 .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=&lt;path to exe in publish directory&gt;

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

我原以为会有一些日志。但是,事件查看器中的“MyTestLog”部分仍为空。

【问题讨论】:

【参考方案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"
      
    
  

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

【讨论】:

感谢您的帖子。它绝对解决了我的问题。但是我遇到了一个小问题。我可以在 WindowsLogs 下看到日志,但在 Applications and Service Logs 部分下看不到。我期待一个新项目,但没有创建任何东西。任何想法。 我已经有一段时间没有在这种环境中工作了,但我确实记得需要刷新我的日志才能查看所有内容。另外,我绝对记得在这些部分中也看到过日志。但是,当时所有这些都处于预览状态,因此此后可能会有更多变化。 它确实有效。但是简单的刷新是行不通的。相反,我需要重新启动事件日志应用程序才能看到它。感谢您的帮助。【参考方案2】:

我正在使用 .NET Core 3.1 和 Microsoft.Extensions.Logging 5.0.0。

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

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

下面的解决方案不需要运行OP中提到的powershell脚本(New-EventLog -LogName MyTestLog -Source MyTestSource)

对我来说可行的解决方案,不需要其他任何东西......

程序.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 中的相同问题

以上是关于如何为 .NET Core 3.0 Worker 服务设置事件日志的主要内容,如果未能解决你的问题,请参考以下文章

[翻译] 使用 .NET Core 3.0 创建一个 Windows 服务

.NET Core 3.0 发布 ARM64

[翻译] 使用 .NET Core 3.0 创建一个 Windows 服务

如何为 .NET Core 重命名 ABP 中的列?

如何为 ASP.net Core 配置 Entity Framework 6

如何为 .NET Core Web API 进行安全身份验证?