【问题标题】:How to setup event log for .NET Core 3.0 Worker Service如何为 .NET Core 3.0 Worker 服务设置事件日志
【发布时间】: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”部分仍为空。

【问题讨论】:

    标签: c# logging .net-core worker


    【解决方案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 中的相同问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    相关资源
    最近更新 更多