[英]How to associate request/response logs in .NET
很常见的场景:
class MyServiceClient
{
ILogger<MyServiceClient> _logger;
async Task Foo(Dto data)
{
_logger.LogDebug("Invoked API {ApiName}", new { ApiName = nameof(Foo), Data = data });
var requestContent = new StringContent(JsonSerializer.Serialize(data))
var httpResponse = await _httpClient.PostAsync(url, requestContent);
string responseStr = httpResponse.ReadAsStringAsync()
if (!httpResponse.IsSuccessStatusCode)
{
_logger.LogError("Failed API {ApiName}", new { ApiName = nameof(Foo), ResponseData = responseStr });
}
}
}
您可以使用ILogger
实现创建一个具有一些属性的 Scope,这些属性将附加到由调用记录器生成的所有遥测数据:
using (_logger.BeginScope(new Dictionary<string, object>
{
{"CorrelationId", Guid.NewGuid()}
}))
{
_logger.LogWarning("Some Warning");
_logger.LogInformation("Some Info");
}
CorrelationId
将位于 Application Insights 中跟踪遥测的customDimensions
字段中。
但是,如果您还想关联依赖请求,您可以直接使用TelemetryClient
并显式创建一个操作,该操作将用于关联该操作范围内所有生成的遥测数据:
using (var operation = _telemetryClient.StartOperation<DependencyTelemetry>("Foo"))
{
_logger.LogDebug("Invoked API {ApiName}", new { ApiName = nameof(Foo), Data = data });
var requestContent = new StringContent(JsonSerializer.Serialize(data))
var httpResponse = await _httpClient.PostAsync(url, requestContent);
string responseStr = httpResponse.ReadAsStringAsync()
if (!httpResponse.IsSuccessStatusCode)
{
_logger.LogError("Failed API {ApiName}", new { ApiName = nameof(Foo), ResponseData = responseStr });
}
}
您可以更进一步,设置遥测属性以反映调用是否成功:
...
if (!httpResponse.IsSuccessStatusCode)
{
_logger.LogError("Failed API {ApiName}", new { ApiName = nameof(Foo), ResponseData = responseStr });
operation.Telemetry.Success = false;
}
...
但请注意,如果您正在构建一个 .Net Web 应用程序,可能已经有一个请求操作正在进行中,并且通过查找该请求遥测数据,您可能会发现跟踪遥测数据和依赖项已经与该请求相关联。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.