我正在尝试实现类似于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进行日志记录。
1条答案
按热度按时间bvjxkvbb1#
这就是
ILogger.BeginScope
的用途。它的API不是很明显;有关使用详情,请参阅this blog post。总之,它看起来像这样: