c# - 如何在旧版 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 服务一起使用?
解决方案
我无法确定是什么导致了这个问题。但是转储旧式 Windows 服务以支持 Microsoft.Extensions.Hosting.WindowsServices 解决了这个问题,因此转换项目更容易。
推荐阅读
- spring-cloud - 在 Spring Cloud 中使用 Kong
- next.js - getServerSideProps 和 mysql (RowDataPacket)
- python - 如何使用python从mongodb加入集合
- swiftui - 从列表项生成 SwiftUI 模式表
- ssh - 同时管理多个谷歌云虚拟机实例/计算引擎
- c - “使用 CMake 生成的文件构建”是什么意思?意思是?
- python - 姜戈。models.py 中的哈希密码
- python - 如何使用 python selenium 在 facebook 中点击页面
- android - 如何以编程方式在android中使用电话号码打开电报帐户(使用意图)
- java - 如何将 mongoDB 的输出转换为 java 对象(使用对象工厂)