如何为 .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=<path to exe in publish directory>
服务创建成功,我可以在服务查看器应用程序中看到它。从那里,我手动启动服务,然后在事件查看器中查看,没有显示任何日志。
我原以为会有一些日志。但是,事件查看器中的“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 创建一个 Windows 服务