首页 > 解决方案 > 如何在旧版 Windows 服务应用程序中向 ILogger 注册 Serilog?

问题描述

我有一个 Windows 服务,我正在尝试升级以使用依赖注入和 Serilog。

这不是 .net 核心 Windows 服务。这是 ServiceBase 的旧样式

下面是我的记录器设置代码。

public static IServiceProvider ConfigureServices()
{
var services = new ServiceCollection();

Log.Logger = new LoggerConfiguration()
   .CreateLogger();

// app starts fine if I remove below line
services.AddLogging(builder => builder.AddSerilog());

return services.BuildServiceProvider();
}

这是我的 ServiceBase 中的 OnStart

protected override void OnStart(string[] args)
{
 try
 {
  Log.Information("Starting Service");
  Task.Run(async () =>
   {
    var provider = Startup.ConfigureServices();
    Log.Information("Done configuring provider");
    supervisor = new Supervisor(provider);
    supervisor.Initialize();
    await supervisor.Run();
   }).ConfigureAwait(false);
  }
  catch (Exception e)
  {
    LogError(e);
  }
}

当我启动服务时,我收到“正在启动服务”消息,但没有收到“完成配置提供程序”消息。然后应用程序立即崩溃并出现此错误

Faulting application name: MyWindowsService.exe, version: 4.0.3.0, time stamp: 0x606f3be8
Faulting module name: clr.dll, version: 4.7.3750.0, time stamp: 0x5fbc74bf
Exception code: 0xc0000005
Fault offset: 0x000184bd
Faulting process id: 0x13d0
Faulting application start time: 0x01d72c9c4fdd7bea
Faulting application path: C:\Program Files\MyWindowsService\MyWindowsService.exe
Faulting module path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Report Id: f5fdda16-5491-4eb2-b5df-878c11b08b5c
Faulting package full name: 
Faulting package-relative application ID: 

我尝试在 AddSerilog 的 true 和 false 之间更改 dispose 值,但没有做任何事情。还尝试了 AddLogging()。然后从提供者那里获取 LoggerFactory 并在其上调用 AddSerilog。

注释掉 services.AddLogging(builder => builder.AddSerilog()); 允许应用程序毫无问题地运行,只是没有 ILogger 日志记录。

我的备份计划是暂时调用静态 serilog 日志。或者努力将项目更新为新的 Windows 服务 HostBuilder 内容。

如何让 Serilog 向 ILogger/ILoggerFactory 注册,以便我可以将它与此 Windows 服务一起使用?

标签: c#serilog

解决方案


我无法确定是什么导致了这个问题。但是转储旧式 Windows 服务以支持 Microsoft.Extensions.Hosting.WindowsServices 解决了这个问题,因此转换项目更容易。


推荐阅读