簡體   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