根据hangfire文档
从 Hangfire 1.3.0 开始,如果 您的应用程序已通过以下方式使用以下库之一 反射(因此 Hangfire 本身不依赖于任何 他们(。通过检查 按如下所示的顺序显示相应类型的存在。
Serilog
NLog
log4Net
EntLib
Logging
Loupe
Elmah
我有 ASP.NET 使用如下Serilog
的Core 2.0应用程序
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseApplicationInsights()
.UseUrls("http://*:40006")
.ConfigureAppConfiguration((hostingContext, config) =>
{
// removed for bravity
})
.ConfigureLogging((hostingContext, logging) =>
{
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(hostingContext.Configuration)
.CreateLogger();
logging.AddSerilog();
})
.Build();
}
应用程序配置为使用 Hangfire。在后台作业处理期间,如果发生任何异常,Hangfire 会按预期以递增的延迟重试作业 10 次,并在仪表板中显示异常。
问题
Hangfire 仪表板在 UI 上显示异常,但它不会将异常记录到配置的 Serilog 接收器中。
注意:Hangfire 仪表板显示异常,但它会格式化此处的异常,该异常隐藏了有关异常的关键信息。 我认为如果它记录异常,Serilog 记录器将记录完整的异常。
我在使用.NET Core 3.1的最新Hangfire版本上遇到了同样的问题。
解决方案是在StartUp.cs
中调用IGlobalConfiguration
的UseSerilogLogProvider()
方法。
例如:
GlobalConfiguration.Configuration.UseSerilogLogProvider();
或
services.AddHangfire(configuration => configuration
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSerilogLogProvider());
通常不需要此调用,但在某些情况下,自动连线不起作用(例如引用多个日志记录提供程序(。您可以在官方 Hangfire 文档中阅读有关此内容的更多信息:配置日志记录