Статический логгер Serilog - это SilentLogger, когда в MassTransit AddBus () возникает исключение.

В настоящее время мы запускаем веб-приложение ASP.NET Core 3, которое использует MassTransit. Мы выбрали Serilog для нашей библиотеки журналов, и он по большей части отлично работает. Мы обнаружили небольшой крайний случай, когда он не может регистрировать определенные ошибки. В нашем Program.cs (фрагмент кода ниже) мы инициализируем статический регистратор, пока служба все еще запускается, и она без проблем регистрируется в консоли.

Если исключение выбрасывается в ConfigureServices методе Startup.cs, служба уничтожается, и исключение выводится на консоль, как ожидалось. Однако, если в методе MassTransit AddBus() возникает исключение, ничего не регистрируется. После небольшой отладки мы увидели, что статический регистратор, который мы установили в Program.cs, заменяется на SilentLogger, и мы полагаем, что это может быть что-то внутреннее в MassTransit, вызывающее это

Код инициализации MassTransit также можно найти ниже.

public class Program
{
    public static void Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
            .Enrich.FromLogContext()
            .WriteTo.Console()
            .CreateLogger();

        try
        {
            Log.Information("Starting up app");
            CreateHostBuilder(args).Build().Run();
        }
        catch (Exception e)
        {
            Log.Fatal(e, "Host terminated unexpectedly");
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }
}
serviceCollection.AddMassTransit(configurator =>
{
    configurator.AddConsumers(consumerAssembly());

    var queueName = appSettings.QueueName;
    configurator.AddBus(provider =>
    {
        MessageDataDefaults.ExtraTimeToLive = TimeSpan.FromDays(1);
        MessageDataDefaults.Threshold = 2000;
        MessageDataDefaults.AlwaysWriteToRepository = false;

        return Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                var configHost = appSettings.RabbitMq.Host;
                var configUser = appSettings.RabbitMq.Username;
                var configPassword = appSettings.RabbitMq.Password;

                cfg.Host(new Uri(configHost), h =>
                {
                    h.Username(configUser);
                    h.Password(configPassword);
                });

                cfg.ReceiveEndpoint(queueName, ec => ec.ConfigureConsumers(provider));
            });
    });

    serviceCollection.AddSingleton<IHostedService, BusHostedService>();
});

Любое исключение, созданное в методе AddBus, вызовет эту проблему. Вот версии, которые мы сейчас используем:

  • MassTransit 7.1.4
  • MassTransit RabbitMq 7.1.4
  • Serilog 2.10.0

Возможно, кто-то здесь сталкивался с этой проблемой раньше? Любая помощь будет оценена ????


person Rohan    schedule 04.02.2021    source источник


Ответы (1)


Во-первых, я очистил вашу конфигурацию, так как она имеет смешанное использование, и это обычно не одобряется.

Что касается проблемы с логированием, MassTransit ничего не знает о SeriLog, но вы можете сообщить MassTransit о Serilog. Используйте пакет Serilog.Extensions.Logging и обязательно добавьте ILoggerFactory/ILogger<> в свою коллекцию служб, используя их методы конфигурации.

serviceCollection.AddMassTransit(configurator =>
{
    configurator.AddConsumers(consumerAssembly());

    configurator.UsingRabbitMq((context,cfg) =>
    {
        // these can actually go anywhere before the bus is created
        MessageDataDefaults.ExtraTimeToLive = TimeSpan.FromDays(1);
        MessageDataDefaults.Threshold = 2000;
        MessageDataDefaults.AlwaysWriteToRepository = false;

        var configHost = appSettings.RabbitMq.Host;
        var configUser = appSettings.RabbitMq.Username;
        var configPassword = appSettings.RabbitMq.Password;

        cfg.Host(new Uri(configHost), h =>
        {
            h.Username(configUser);
            h.Password(configPassword);
        });

        var queueName = appSettings.QueueName;
        cfg.ReceiveEndpoint(queueName, ec => ec.ConfigureConsumers(context));
    });
});
serviceCollection.AddSingleton<IHostedService, BusHostedService>();

Возможный синтаксис для добавления Serilog в контейнер:

services.TryAddSingleton<ILoggerFactory>(_ => new SerilogLoggerFactory());
services.TryAddSingleton(typeof(ILogger<>), typeof(Logger<>));
person Chris Patterson    schedule 04.02.2021
comment
Спасибо за ответ. Я обновил настройку MassTransit, используя фрагмент, который вы предоставили выше, я также добавил Serilog в контейнер DI, но я все еще сталкиваюсь с той же проблемой. Просто в этом случае любое исключение, которое теперь выбрасывается в 'UsingRabbitMq ()', не попадает в 'Program.cs', оно просто печатает Запуск приложения, а затем умирает - person Rohan; 05.02.2021
comment
Какое исключение выброшено, что не отловлено? - person Chris Patterson; 05.02.2021
comment
Итак, мы обнаружили это, когда объект RabbitMq был нулевым и было сгенерировано исключение NullReferenceException. После этого мы попробовали создать собственное исключение и увидели то же самое. - person Rohan; 05.02.2021
comment
Вероятно, он брошен в вашу BusHostedService или его фабрику, которая пытается разрешить шину из контейнера, что, конечно же, вызывает исключение, потому что фабричный метод для объекта сгенерировал исключение. - person Chris Patterson; 06.02.2021
comment
Мы добавим туда несколько операторов catch и посмотрим, сможем ли мы перехватить исключение, но ради интереса, как это помешает регистрации исключения? - person Rohan; 07.02.2021