[从Hangfire 1.3.0开始,如果 您的应用程序已通过以下方式使用以下库之一 反思(这样,Hangfire本身就不依赖于任何 他们)。通过检查是否自动选择日志记录实现 相应类型的存在顺序如下所示。
Serilog 日志 Log4Net EntLib 记录中 放大镜 埃尔玛
我有正在使用Serilog
的ASP.NET 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仪表板显示异常,但是它格式化异常see here,它隐藏有关异常的关键信息。我认为,如果它记录了异常,Serilog记录器将记录完整的异常。
我在使用.NET Core 3.1的最新Hangfire版本中遇到相同的问题。
解决方案是在UseSerilogLogProvider()
中调用IGlobalConfiguration
的StartUp.cs
方法。
例如:
GlobalConfiguration.Configuration.UseSerilogLogProvider();
或
services.AddHangfire(configuration => configuration
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSerilogLogProvider());
通常不需要此调用,但是在某些情况下,自动接线不起作用(例如,将引用多个日志记录提供程序)。您可以在正式的Hangfire文档中阅读有关此内容的更多信息:Configure Logging