繁体   English   中英

如何在 .NET 中关联请求/响应日志

[英]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 }); 
      }

   }
}
  1. 如何关联请求(“调用的 API”)和响应(“失败的 API”)日志? \不是我正在使用应用洞察记录器。
  2. 是否可以将依赖日志(由 http 客户端生成的日志)与此“操作”相关联?

您可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM