Skip to content

ОтелКомпозитныйПроцессорЛогов ​

Композитный процессор логов — цепочка процессоров записей лога, которая работает как один процессор.

Описание ​

Передаёт каждый вызов процессорам цепочки в порядке добавления. Реализует ИнтерфейсПроцессорЛогов, поэтому регистрируется в провайдере как обычный процессор — например, чтобы передать несколько процессоров конструктору ОтелПровайдерЛогирования, который принимает один процессор.

Провайдер логирования и сам хранит свои процессоры в композитном процессоре: ДобавитьПроцессор провайдера добавляет процессор в эту цепочку, а логгеры передают ей записи. Сброс буфера и закрытие провайдер выполняет сам, вызывая каждый процессор цепочки напрямую (см. СброситьБуфер и Закрыть провайдера).

Список процессоров изменяется копированием: ДобавитьПроцессор создаёт новый список, поэтому цепочка обходится без блокировки, а обход, уже начатый в другом потоке или в самом процессоре, продолжается по прежнему списку.

Конструктор ​

bsl
Новый ОтелКомпозитныйПроцессорЛогов(Процессоры)
ПараметрТипПо умолчаниюОписание
ПроцессорыМассив—Процессоры логов в порядке вызова. Массив копируется: его изменение после создания цепочку не меняет

Методы ​

ДобавитьПроцессор ​

Добавляет процессор в конец цепочки. Обход цепочки, уже начатый в другом потоке или в самом процессоре, продолжается по прежнему списку: новый процессор получают следующие вызовы. Объект не проверяется: как проявляется процессор без нужных методов, см. ИнтерфейсПроцессорЛогов.

ПараметрТипПо умолчаниюОписание
ПроцессорПроизвольный—Процессор логов

Методы процессора ​

Методы ИнтерфейсПроцессорЛогов. Их вызывает провайдер логирования, в который добавлен композитный процессор: ПриПоявлении — логгер в Записать, Включен — Включен логгера, СброситьБуфер — СброситьБуфер и ПринудительноВыгрузитьСРезультатом провайдера, Закрыть — Закрыть провайдера. Приложению вызывать их не нужно, если композитный процессор добавлен в провайдер.

ПриПоявлении ​

Передаёт запись лога каждому процессору цепочки (OnEmit). Все процессоры получают один и тот же объект записи: изменения, сделанные одним процессором, видны следующим (спецификация, раздел OnEmit). Параметры не копируются: если процессор переприсвоит параметр (ЗаписьЛога или Контекст), новое значение получат и следующие процессоры. Исключение процессора записывается в лог предупреждением и не прерывает цепочку.

ПараметрТипПо умолчаниюОписание
ЗаписьЛогаОтелЗаписьЛога—Запись лога
КонтекстФиксированноеСоответствие, Соответствие, НеопределеноНеопределеноРазрешённый контекст: переданный в Логгер.Записать или текущий контекст потока

Включен ​

Проверяет, будет ли хотя бы один процессор цепочки обрабатывать запись с такими параметрами (Enabled). Процессоры опрашиваются по порядку до первого, вернувшего Истина, — остальные не опрашиваются. Процессор, у которого Включен бросает исключение (в том числе если метода нет), считается включённым.

Каждый процессор получает свои копии параметров: переприсваивание параметра одним процессором не видно следующим и вызывающему.

ПараметрТипПо умолчаниюОписание
КонтекстФиксированноеСоответствие, Соответствие, НеопределеноНеопределеноКонтекст
ОбластьИнструментированияОтелОбластьИнструментированияНеопределеноОбласть инструментирования логгера
СтепеньСерьезностиЧисло0Номер серьезности записи, 0 — не указан
ИмяСобытияСтрока""Имя события

Возвращает: Булево — Истина, если хотя бы один процессор вернул Истина или бросил исключение; Ложь, если процессоров нет или все вернули Ложь


СброситьБуфер ​

Сбрасывает буфер процессоров цепочки по порядку (ForceFlush). Каждый процессор получает время, оставшееся до общего срока. Если срок истёк раньше, чем дошла очередь до следующего процессора, метод сразу возвращает таймаут, и оставшиеся процессоры не вызываются. Исключение процессора записывается в лог предупреждением.

ПараметрТипПо умолчаниюОписание
ТаймаутМсЧисло0Общий срок в миллисекундах, 0 — без ограничения

Возвращает: ОтелРезультатЭкспорта — таймаут, если срок истёк до вызова очередного процессора; иначе неуспешный результат последнего процессора, сообщившего о сбое (исключение процессора — ошибка); иначе успех. Результат процессора Неопределено считается успехом, а значение без метода Успешно (например, Булево) — ошибкой


Закрыть ​

Закрывает все процессоры цепочки (Shutdown) в пределах общего срока. Закрыть вызывается у каждого процессора — даже после исключения в предыдущем и после истечения срока: тогда процессор получает 1 мс и должен завершиться без ожидания. При ТаймаутМс = 0 Закрыть процессоров вызывается без параметра, и каждый процессор применяет свой таймаут по умолчанию. Неуспешный итог записывается в лог предупреждением.

Своего признака закрытия у композитного процессора нет: повторный вызов снова вызывает Закрыть процессоров, а ПриПоявлении после закрытия по-прежнему передаёт записи процессорам — встроенные процессоры после своего Закрыть записи игнорируют.

ПараметрТипПо умолчаниюОписание
ТаймаутМсЧисло0Общий срок в миллисекундах, 0 — без общего срока

Возвращает: ОтелРезультатЗакрытия — ошибка, если хотя бы один процессор вернул ошибку или Ложь либо бросил исключение (описания перечислены через ; ); иначе таймаут, если истёк срок или процессор сообщил о таймауте; иначе успех

Внутренние методы ​

Экспортированы только для вызова из других модулей SDK (в OneScript нет внутренней видимости), приложению вызывать их не нужно:

  • ЕстьПроцессоры — есть ли в цепочке хотя бы один процессор: без процессоров Включен логгера возвращает Ложь;
  • Процессоры — копия списка процессоров цепочки: по ней провайдер сбрасывает буфер и закрывает процессоры.

Пример ​

bsl
// ПакетныйПроцессор - пакетный процессор логов (см. ОтелПакетныйПроцессорЛогов),
// ОтладочныйЭкспортер - второй экспортер логов
Процессоры = Новый Массив();
Процессоры.Добавить(ПакетныйПроцессор);
Процессоры.Добавить(Новый ОтелПростойПроцессорЛогов(ОтладочныйЭкспортер));
Процессор = Новый ОтелКомпозитныйПроцессорЛогов(Процессоры);

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

// Провайдер закрывает композитный процессор, а тот - процессоры цепочки
Провайдер.Закрыть();

См. также ​