【问题标题】:Serilog Sink with MassTransit - IBus service resolution causes an endless loopSerilog Sink with MassTransit - IBus 服务解析导致死循环
【发布时间】:2023-01-11 05:12:02
【问题描述】:

我正在尝试为 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; } 
}

【问题讨论】:

    标签: dependency-injection serilog masstransit


    【解决方案1】:

    我能够通过手动将 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 似乎无法工作,因为它没有命中调试器,但如果您查看 ILogger 实例,它是一个 Serilog.Extension.ILogger。

    我想我会在这里发布这个以防其他人遇到同样的问题。我花了几个小时才弄清楚这个问题。任何人都知道更好的解决方案更具可读性?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-06
      • 2021-03-14
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      相关资源
      最近更新 更多