繁体   English   中英

Serilog Sink with MassTransit - IBus 服务解析导致无限循环

[英]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.csUseSerilog部分:

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.ILoggerSerilog.ILogger可用的解决方案吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM