Skip to content

Логирование

OpenTelemetry Logs API позволяет собирать структурированные записи логов и экспортировать их в формате OTLP. Логи автоматически коррелируют с трассировкой через контекст — в каждую запись автоматически добавляются TraceId и SpanId текущего активного спана.

Архитектура

ОтелПровайдерЛогирования
    └── ОтелЛоггер
            └── ОтелЗаписьЛога
  • ОтелПровайдерЛогирования — точка входа, создаёт логгеры.
  • ОтелЛоггер — создаёт и отправляет записи логов.
  • ОтелЗаписьЛога — запись с телом, уровнем серьёзности и атрибутами.

Создание провайдера через построитель

bsl
#Использовать opentelemetry

Ресурс = Новый ОтелРесурс();
Ресурс.Атрибуты().Установить("service.name", "my-service");

Транспорт = Новый ОтелHttpТранспорт("http://localhost:4318");
Экспортер = Новый ОтелЭкспортерЛогов(Транспорт);

Провайдер = Новый ОтелПостроительПровайдераЛогирования()
    .УстановитьРесурс(Ресурс)
    .ДобавитьПроцессор(Новый ОтелПакетныйПроцессорЛогов(Экспортер))
    .Построить();

Логгер = Провайдер.ПолучитьЛоггер("my-library", "1.0.0");

Создание записей лога

ОтелЗаписьЛога строится через Fluent API:

bsl
Запись = Логгер.СоздатьЗаписьЛога();
Запись.УстановитьТело("Пользователь авторизован")
    .УстановитьСерьезность(ОтелСтепеньСерьезности.Info());

Логгер.Записать(Запись);
bsl
Запись = Логгер.СоздатьЗаписьЛога();
Запись.УстановитьТело("Запрос выполнен")
    .УстановитьСерьезность(ОтелСтепеньСерьезности.Info())
    .УстановитьАтрибут("user.id", "12345")
    .УстановитьАтрибут("http.method", "POST")
    .УстановитьАтрибут("http.status_code", 201);

Логгер.Записать(Запись);
bsl
Попытка
    // ... работа ...
Исключение
    Запись = Логгер.СоздатьЗаписьЛога();
    Запись.УстановитьТело(ОписаниеОшибки())
        .УстановитьСерьезность(ОтелСтепеньСерьезности.Error())
        .УстановитьАтрибут("exception.type", "ОшибкаВыполнения");
    Логгер.Записать(Запись);
КонецПопытки

Уровни серьёзности

ОтелСтепеньСерьезности соответствует спецификации OpenTelemetry (числовые значения 1–24):

МетодЧисловое значениеОписание
ОтелСтепеньСерьезности.Trace()1Детальная трассировка
ОтелСтепеньСерьезности.Trace2()Trace4()2–4Варианты Trace
ОтелСтепеньСерьезности.Debug()5Отладочная информация
ОтелСтепеньСерьезности.Debug2()Debug4()6–8Варианты Debug
ОтелСтепеньСерьезности.Info()9Информационное сообщение
ОтелСтепеньСерьезности.Info2()Info4()10–12Варианты Info
ОтелСтепеньСерьезности.Warn()13Предупреждение
ОтелСтепеньСерьезности.Warn2()Warn4()14–16Варианты Warn
ОтелСтепеньСерьезности.Error()17Ошибка
ОтелСтепеньСерьезности.Error2()Error4()18–20Варианты Error
ОтелСтепеньСерьезности.Fatal()21Критическая ошибка
ОтелСтепеньСерьезности.Fatal2()Fatal4()22–24Варианты Fatal

Корреляция с трассировкой

Корреляция происходит автоматически. Если в момент записи лога активен спан, его TraceId и SpanId добавляются в запись:

bsl
// Трассировка уже инициализирована
Спан = Трассировщик.НачатьСпан("обработка", ОтелВидСпана.Внутренний());
Область = Спан.СделатьТекущим();

// Запись лога автоматически получит TraceId и SpanId из контекста
Запись = Логгер.СоздатьЗаписьЛога();
Запись.УстановитьТело("Начало обработки")
    .УстановитьСерьезность(ОтелСтепеньСерьезности.Info());
Логгер.Записать(Запись);

Область.Закрыть();
Спан.Завершить();

Интеграция с logos

ОтелАппендерLogos перенаправляет все сообщения библиотеки logos в OpenTelemetry. Это позволяет использовать привычный API logos, не меняя код.

bsl
#Использовать opentelemetry
#Использовать logos

Ресурс = Новый ОтелРесурс();
Ресурс.Атрибуты().Установить("service.name", "my-service");

Транспорт = Новый ОтелHttpТранспорт("http://localhost:4318");
Экспортер = Новый ОтелЭкспортерЛогов(Транспорт);
Процессор = Новый ОтелПростойПроцессорЛогов(Экспортер);

Провайдер = Новый ОтелПровайдерЛогирования(Ресурс, Процессор);
ОтелЛоггер = Провайдер.ПолучитьЛоггер("my-library", "1.0.0");

// Создаём аппендер и добавляем его к logos-логу
Аппендер = Новый ОтелАппендерLogos(ОтелЛоггер);

Лог = Логирование.ПолучитьЛог("oscript.app.myapp");
Лог.ДобавитьСпособВывода(Аппендер);

// Теперь все сообщения logos отправляются в OpenTelemetry
Лог.Информация("Приложение запущено");
Лог.Предупреждение("Конфигурация не найдена, используются значения по умолчанию");
Лог.Ошибка("Произошла ошибка: файл не найден");

Маппинг уровней logos → ОтелСтепеньСерьезности:

logosOTel Severity
ОтладкаDebug
ИнформацияInfo
ПредупреждениеWarn
ОшибкаError

Мост логов → события спана

ОтелПроцессорСобытийВSpanEvents преобразует записи логов в события активного спана. Это удобно для отображения логов непосредственно в трассировке:

bsl
// Добавляем процессор, который пишет логи как span events
Провайдер = Новый ОтелПостроительПровайдераЛогирования()
    .УстановитьРесурс(Ресурс)
    .ДобавитьПроцессор(Новый ОтелПростойПроцессорЛогов(Экспортер))
    .ДобавитьПроцессор(Новый ОтелПроцессорСобытийВSpanEvents())
    .Построить();

Процессоры логов

Простой процессор (для разработки)

bsl
Процессор = Новый ОтелПростойПроцессорЛогов(Экспортер);

Пакетный процессор (для продакшена)

bsl
Процессор = Новый ОтелПакетныйПроцессорЛогов(Экспортер);

Пакетный процессор логов использует те же настройки OTEL_BSP_*, что и для спанов, но значение по умолчанию OTEL_BSP_SCHEDULE_DELAY = 1000 мс (вместо 5000 у спанов).

Композитный процессор

bsl
Процессор = Новый ОтелКомпозитныйПроцессорЛогов();
Процессор.ДобавитьПроцессор(Новый ОтелПакетныйПроцессорЛогов(Экспортер));
Процессор.ДобавитьПроцессор(Новый ОтелПроцессорСобытийВSpanEvents());

Смотрите также