Как сопоставить связанные пользовательские журналы с помощью 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
}