如何在.NET Core 6中设置值(correlationId)并使其在整个方法执行过程中可访问(类似于从HttpContext访问值)

qmelpv7a  于 2023-05-23  发布在  .NET
关注(0)|答案(1)|浏览(267)

我正在尝试实现类似于correlationId的东西,其中所有方法都可以访问HttpContext对象的头部,并使用correlationId进行日志记录。
除了我尝试执行的代码不是由Http请求触发的。它驻留在后台服务中,每10分钟连续运行一次。下面是一个最小的例子。

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
    while (!stoppingToken.IsCancellationRequested)
    {
        foreach(var item in items)
        {
            await _myService.PerformSomeOperations(item);
        }
        await Task.Delay(10 * 1000);   
    }
}

PerformSomeOperations方法在内部可能调用许多不同类中的多个方法。这将导致大量日志。
我希望能够识别来自某个PerformSomeOperations()调用的所有日志。我想在不修改所有方法签名的情况下实现它,以包含correlationId参数并在整个调用链中传递沿着。
此外,我们可能会在不久的将来并行执行PerformSomeOperations()。那么现有的日志会混淆,我们需要一些东西来识别单个PerformSomeOperations()调用下的所有日志。
任何帮助或线索如何实现一个可行的解决方案是非常感谢。谢谢。
编辑:请注意,我使用log4net进行日志记录。

bvjxkvbb

bvjxkvbb1#

这就是ILogger.BeginScope的用途。它的API不是很明显;有关使用详情,请参阅this blog post
总之,它看起来像这样:

using (_logger.BeginScope(new Dictionary<string, object>() { ["CorrelationId"] = correlationId }))
{
  // All log messages in here have a CorrelationId automatically applied.
}

相关问题