【问题标题】:Log correlation id using Hangfire Filter使用 Hangfire 过滤器记录相关 ID
【发布时间】:2021-02-23 12:08:32
【问题描述】:

我正在尝试使用Hangfire FilterILogger.BeginScope 来记录相关ID。要求是每个作业执行都有自己的关联 ID,以便在发生某些事情时更容易将同一作业执行的日志组合在一起。

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

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

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

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

【问题讨论】:

    标签: hangfire


    【解决方案1】:

    终于明白了。原因是当本地IServerFilter.OnPerforming中的本地IDisposable由本地ILogger实例创建的IDisposable超出范围时,由于没有再次引用它,一段时间后,GC将收集它,因此本地创建的范围将丢失.解决方案很简单,在过滤器上使用AsyncLocal&lt;ILogger&gt; 实例来保存对创建范围的引用,并且仅在作业完成后才释放它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-29
      • 2010-10-27
      • 2021-03-07
      • 1970-01-01
      • 2015-02-13
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多