使用Hangfire Filter的日志关联id



我正在尝试使用Hangfire过滤器和ILogger。记录关联id。要求是每个作业执行都有自己的关联id,以便在发生某些情况时更容易将相同作业执行的日志分组在一起。

我的方法是,在IServerFilter.OnPerforming方法中,我首先创建一个GUID,然后使用下面的代码开始范围

logger.BeginScope(new FormattedDictionary<string, object>
{
["CorrelationId"] = correlationId
})

方法IServerFilter.OnPerforming中的后续日志语句将附加相关id。但不幸的是,在作业执行期间,日志语句没有关联id范围。使用构造函数解析作业类的ILogger实例。IServerFilter.OnPerforming方法的ILogger实例使用IServiceProvider.GetRequiredService方法解析

我想知道为什么会这样?我们如何解决这个问题?我对实现日志关联id的其他方法持开放态度,只要它能工作。

终于想通了。原因是,当由本地ILogger实例创建的IServerFilter.OnPerforming中的本地IDisposable超出作用域时,由于没有再引用它,过了一段时间,GC将收集它,因此本地创建的作用域将丢失。解决方案很简单,在过滤器上使用AsyncLocal<ILogger>实例来保存对已创建范围的引用,并仅在作业完成后才将其丢弃

最新更新