Как сопоставить связанные пользовательские журналы с помощью ILogger и сведений о приложении?

У меня есть служба, которая выполняет некоторые вызовы REST API, и я веду пользовательский журнал до и после вызова API:

      _logger.LogTrace("Invoked API {ApiName}", new { ApiName = apiName, Data = json });

var httpResponse = await _httpClient.PostAsync(url, new StringContent(json));
httpResponse.EnsureSuccessStatusCode();
var responseDto = await JsonSerializer.DeserializeAsync<ResponseDto>(httpResponse.Content.ReadAsStream())!;

if (!responseData.Success)
{
    _logger.LogWarning("Failed API {ApiName}", new { ApiName = apiName, Data = await httpResponse.Content.ReadAsStringAsync() });
}

HttpClient также создает журналы.

Каков рекомендуемый подход для корреляции журналов, чтобы можно было легко найти связанные журналы на портале Application Insights?

Я хотел бы, чтобы все журналы, созданные HttpClient или, возможно, ADO.NET и т. д., были связаны с моим пользовательским журналом.

РЕДАКТИРОВАТЬ: я знаю, что ASP.NET Core MVC или Pages автоматически сопоставляют журналы, используя OperationTelemetry для каждого запроса. Мне нужно то же самое для других сценариев: консольное приложение, богатый клиент, сервер blazor (вместо запросов используются веб-сокеты)

3 ответа

Таким образом, телеметрия автоматически связывается только тогда, когда она является частью операции. Например, операция создается, когда контроллер получает запрос. Это делается во время выполнения.

Если у вас нет ожидающей операции, вам потребуется вручную добавить контекст, чтобы вы могли связать телеметрию, или вы можете создать свою собственную операцию, чтобы связать телеметрию с этой конкретной операцией. Вы можете сделать это следующим образом:

      using (var op = _telemetryClient.StartOperation<DependencyTelemetry>($"Invoke API {ApiName}"))
{
    _logger.LogTrace("Invoked API {ApiName}", new { ApiName = apiName, Data = json });

    var httpResponse = await _httpClient.PostAsync(url, new StringContent(json));
    httpResponse.EnsureSuccessStatusCode();
    var responseDto = await JsonSerializer.DeserializeAsync<ResponseDto>(httpResponse.Content.ReadAsStream())!;

    if (!responseData.Success)
    {
        op.Telemetry.Success = false;
        _logger.LogWarning("Failed API {ApiName}", new { ApiName = apiName, Data = await httpResponse.Content.ReadAsStringAsync() });
    }
}

Теперь вся телеметрия будет коррелироваться в рамках операции.

Журналы ILogger автоматически коррелируются, если вы полностью включите ApplicationInsights для Asp.Net Core в соответствии с этим документом: https://learn.microsoft.com/en-us/azure/azure-monitor/app/asp-net-core . Например, все журналы будут иметь одинаковый идентификатор операции, если они выполняются как часть одного и того же запроса.

Также проверьте: https://learn.microsoft.com/en-us/azure/azure-monitor/app/correlation .

Если вы хотите просто добавить свой собственный идентификатор корреляции, вы можете сделать это, используя области данных регистратора:

      using (logger.BeginScope(new Dictionary<string, object>{
    ["OperationId"] = Guid.NewGuid().ToString("N"),
}))
{
  ... // logs from any code in here will have an OperationId
}
Другие вопросы по тегам