[英]Serilog Sink with MassTransit - IBus service resolution causes an endless loop
我正在尝试为 Serilog 设置一个接收器,它通过 MassTransit 发布日志消息。 当我尝试在启动时创建接收器时遇到问题。 创建接收器会导致无限循环。
我应该如何注册依赖注入来解决这个圈子?
我认为这是因为 MassTransit.IBus 使用了 ILogger。 因此,当创建记录器时,它会使用 IBus 请求我的接收器,IBus 请求记录器,后者请求 IBus,等等。
Program.cs 中的启动代码
//Code that sets up my mass transit. IBus is registered as part of it.
builder.Host.SetupMassTransit();
builder.Host.UseSerilog((ctx, services, lc) =>
{
lc.WriteTo.Sink(new MassTransitSink(services.GetService<IBus>())); //Set a breakpoint here
});
在lc.WriteTo.Sink(...
上设置一个断点,你会看到它被重复调用。
轨道交通下沉
public class MassTransitSink : ILogEventSink
{
private readonly IBus bus;
public MassTransitSink(IBus bus)
{
this.bus = bus;
}
public async void Emit(LogEvent logEvent)
{
await bus.Publish<MyLog>(new MyLog("Hello World"));
}
}
public class MyLog
{
public MyLog(string message)
{
Message = message;
}
public string Message { get; set; }
}
我能够通过手动将Serilog.ILogger
的实例添加到依赖项容器来解决这个问题。
替换program.cs
的UseSerilog
部分:
builder.Host.UseSerilog((ctx, services, lc) =>
{
lc.WriteTo.Sink(new MassTransitSink(services.GetService<IBus>()));
});
使用代码手动添加ILogger
实例。
builder.Host.ConfigureServices(services =>
{
services.AddSingleton<Serilog.ILogger>(sp =>
{
var bus = sp.GetRequiredService<IBus>();
return new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Sink(new MassTransitSink(bus))
.CreateLogger();
});
services.AddLogging(configure => configure.ClearProviders().AddSerilog());
});
Serilog.ILogger
现在可以在调试器中使用。 但是Microsoft.Extensions.Logging.ILogger
不起作用,即使在安装程序使用.UseSerilog()
时它通常可用。
我想我会在这里发布这个以防其他人遇到同样的问题。 我花了几个小时才弄清楚这个问题。
有人知道更具可读性和/或Microsoft.Extensions.Logging.ILogger
和Serilog.ILogger
可用的解决方案吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.