如何为 .NET Core 3.0 Worker Service 设置事件日志
How to setup event log for .NET Core 3.0 Worker Service
我正在使用带有 .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" "Applications and Services Logs"。
然后,为了将我的 Worker 设置为 Windows 服务,我 运行 从提升的命令提示符下执行以下命令:
dotnet publish -o publish
(发布项目并输出到发布目录)
sc create MyTestService binPath=<path to exe in publish directory>
服务创建成功,我可以在服务查看器应用程序中看到它。从那里,我手动启动该服务,然后在事件查看器中检查回来,没有显示任何日志。
我原以为会有一些日志。但是,"MyTestLog" 部分在事件查看器中仍为空。
所以我能够找到报告的问题 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"
}
}
}
}
这会覆盖默认设置并允许再次查看信息日志。
我正在使用 .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 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" "Applications and Services Logs"。
然后,为了将我的 Worker 设置为 Windows 服务,我 运行 从提升的命令提示符下执行以下命令:
dotnet publish -o publish
(发布项目并输出到发布目录)
sc create MyTestService binPath=<path to exe in publish directory>
服务创建成功,我可以在服务查看器应用程序中看到它。从那里,我手动启动该服务,然后在事件查看器中检查回来,没有显示任何日志。
我原以为会有一些日志。但是,"MyTestLog" 部分在事件查看器中仍为空。
所以我能够找到报告的问题 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"
}
}
}
}
这会覆盖默认设置并允许再次查看信息日志。
我正在使用 .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"
}
}
}
}