如何解决当 MassTransit AddBus() 中出现异常时,Serilog 静态记录器是 SilentLogger
我们目前正在运行一个使用 MassTransit 的 ASP.NET Core 3 Web 应用程序。我们为我们的日志库选择了 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
方法中抛出的任何异常都会导致此问题。以下是我们目前使用的版本:
- 大众运输 7.1.4
- MassTransit RabbitMq 7.1.4
- Serilog 2.10.0
也许这里有人以前遇到过这个问题?任何帮助将不胜感激?
解决方法
首先,我清理了您的配置,因为它有一些混合用途,通常不受欢迎。
至于日志记录问题,MassTransit 对 SeriLog 一无所知,但您可以将 Serilog 告诉 MassTransit。使用 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<>));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。