Кореляція логів
У цьому посібнику пояснюється, як можна співвідносити логи з трейсами в OpenTelemetry .NET.
Підтримка моделі даних журналювання для кореляції
Модель даних журналювання OpenTelemetry визначає поля, які дозволяють корелювати лог з відрізком (Activity в .NET). Поля TraceId та SpanId дозволяють корелювати лог з відповідним Activity.
Автоматична кореляція в OpenTelemetry .NET
В OpenTelemetry .NET SDK не потрібно вживати жодних дій з боку користувача для активації кореляції. SDK автоматично активує кореляцію логів з Activity, заповнюючи поля TraceId, SpanId та TraceFlags з активної дії (тобто Activity.Current), якщо така існує.
Приклад
Ось простий приклад, який демонструє, як генерувати логи в контексті активної Activity:
using System;
using System.Diagnostics;
using Microsoft.Extensions.Logging;
using OpenTelemetry;
using OpenTelemetry.Logs;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
// Створити фабрику логів за допомогою OpenTelemetry
using var loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddOpenTelemetry(options =>
{
options.AddConsoleExporter();
});
});
// Створити провайдер трасування
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddSource("MyCompany.MyProduct.MyLibrary")
.AddConsoleExporter()
.Build();
// Отримати екземпляр логера
var logger = loggerFactory.CreateLogger<Program>();
// Створити джерело активності
var activitySource = new ActivitySource("MyCompany.MyProduct.MyLibrary");
// Розпочати активність
using (var activity = activitySource.StartActivity("SayHello"))
{
// Логування в контексті активності
logger.FoodPriceChanged("artichoke", 9.99);
}
// Визначте методи розширення для структурованого логування
internal static partial class LoggerExtensions
{
[LoggerMessage(LogLevel.Information, "Food `{name}` price changed to `{price}`.")]
public static partial void FoodPriceChanged(this ILogger logger, string name, double price);
}
Запуск застосунку дасть наступний результат в консолі:
LogRecord.Timestamp: 2024-01-26T17:55:39.2273475Z
LogRecord.TraceId: aed89c3b250fb9d8e16ccab1a4a9bbb5
LogRecord.SpanId: bd44308753200c58
LogRecord.TraceFlags: Recorded
LogRecord.CategoryName: Program
LogRecord.Severity: Info
LogRecord.SeverityText: Information
LogRecord.Body: Food `{name}` price changed to `{price}`.
LogRecord.Attributes (Key:Value):
name: artichoke
price: 9.99
OriginalFormat (a.k.a Body): Food `{name}` price changed to `{price}`.
LogRecord.EventId: 344095174
LogRecord.EventName: FoodPriceChanged
...
Activity.TraceId: aed89c3b250fb9d8e16ccab1a4a9bbb5
Activity.SpanId: bd44308753200c58
Activity.TraceFlags: Recorded
Activity.ActivitySourceName: MyCompany.MyProduct.MyLibrary
Activity.DisplayName: SayHello
Activity.Kind: Internal
Activity.StartTime: 2024-01-26T17:55:39.2223849Z
Activity.Duration: 00:00:00.0361682
...
Як бачите, LogRecord автоматично має поля TraceId та SpanId, що відповідають полям з Activity. Це відбувається тому, що журнал було створено в контексті активної Activity.
У посібнику Початок роботи з консоллю журнал створювався поза контекстом Activity, тому ці поля кореляції в LogRecord не заповнювалися.
Вебзастосунки
У вебзастосунках, таких як ASP.NET Core, всі журнали, створені в контексті запиту, автоматично корелюються з Activity, що представляє вхідний запит, що спрощує пошук усіх журналів, повʼязаних з конкретним запитом.
Переваги кореляції логів
Кореляція логів має кілька переваг:
- Уніфікований вигляд: Ви можете бачити журнали та трасування разом в уніфікованому вигляді у вашому інструменті спостереження.
- Збагачення контексту: Журнали збагачуються контекстом трасування, що робить їх більш інформативними.
- Виправлення помилок: Швидко знаходьте всі журнали, повʼязані з конкретним трейсом, під час пошуку розвʼязання проблем.
- Аналіз продуктивності: Розумійте, що впливає на продуктивність вашого застосунку.
Дізнайтесь більше
Відгук
Чи це було корисним?
Дякуємо. Ми цінуємо ваші відгуки!
Будь ласка, дайте нам знати як ми можемо покращити цю сторінку. Ми цінуємо ваші відгуки!