ОтелКомпозитныйПроцессорЛогов
Композитный процессор логов — цепочка процессоров записей лога, которая работает как один процессор.
Описание
Передаёт каждый вызов процессорам цепочки в порядке добавления. Реализует ИнтерфейсПроцессорЛогов, поэтому регистрируется в провайдере как обычный процессор — например, чтобы передать несколько процессоров конструктору ОтелПровайдерЛогирования, который принимает один процессор.
Провайдер логирования и сам хранит свои процессоры в композитном процессоре: ДобавитьПроцессор провайдера добавляет процессор в эту цепочку, а логгеры передают ей записи. Сброс буфера и закрытие провайдер выполняет сам, вызывая каждый процессор цепочки напрямую (см. СброситьБуфер и Закрыть провайдера).
Список процессоров изменяется копированием: ДобавитьПроцессор создаёт новый список, поэтому цепочка обходится без блокировки, а обход, уже начатый в другом потоке или в самом процессоре, продолжается по прежнему списку.
Конструктор
Новый ОтелКомпозитныйПроцессорЛогов(Процессоры)| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
Процессоры | Массив | — | Процессоры логов в порядке вызова. Массив копируется: его изменение после создания цепочку не меняет |
Методы
ДобавитьПроцессор
Добавляет процессор в конец цепочки. Обход цепочки, уже начатый в другом потоке или в самом процессоре, продолжается по прежнему списку: новый процессор получают следующие вызовы. Объект не проверяется: как проявляется процессор без нужных методов, см. ИнтерфейсПроцессорЛогов.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
Процессор | Произвольный | — | Процессор логов |
Методы процессора
Методы ИнтерфейсПроцессорЛогов. Их вызывает провайдер логирования, в который добавлен композитный процессор: ПриПоявлении — логгер в Записать, Включен — Включен логгера, СброситьБуфер — СброситьБуфер и ПринудительноВыгрузитьСРезультатом провайдера, Закрыть — Закрыть провайдера. Приложению вызывать их не нужно, если композитный процессор добавлен в провайдер.
ПриПоявлении
Передаёт запись лога каждому процессору цепочки (OnEmit). Все процессоры получают один и тот же объект записи: изменения, сделанные одним процессором, видны следующим (спецификация, раздел OnEmit). Параметры не копируются: если процессор переприсвоит параметр (ЗаписьЛога или Контекст), новое значение получат и следующие процессоры. Исключение процессора записывается в лог предупреждением и не прерывает цепочку.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
ЗаписьЛога | ОтелЗаписьЛога | — | Запись лога |
Контекст | ФиксированноеСоответствие, Соответствие, Неопределено | Неопределено | Разрешённый контекст: переданный в Логгер.Записать или текущий контекст потока |
Включен
Проверяет, будет ли хотя бы один процессор цепочки обрабатывать запись с такими параметрами (Enabled). Процессоры опрашиваются по порядку до первого, вернувшего Истина, — остальные не опрашиваются. Процессор, у которого Включен бросает исключение (в том числе если метода нет), считается включённым.
Каждый процессор получает свои копии параметров: переприсваивание параметра одним процессором не видно следующим и вызывающему.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
Контекст | ФиксированноеСоответствие, Соответствие, Неопределено | Неопределено | Контекст |
ОбластьИнструментирования | ОтелОбластьИнструментирования | Неопределено | Область инструментирования логгера |
СтепеньСерьезности | Число | 0 | Номер серьезности записи, 0 — не указан |
ИмяСобытия | Строка | "" | Имя события |
Возвращает: Булево — Истина, если хотя бы один процессор вернул Истина или бросил исключение; Ложь, если процессоров нет или все вернули Ложь
СброситьБуфер
Сбрасывает буфер процессоров цепочки по порядку (ForceFlush). Каждый процессор получает время, оставшееся до общего срока. Если срок истёк раньше, чем дошла очередь до следующего процессора, метод сразу возвращает таймаут, и оставшиеся процессоры не вызываются. Исключение процессора записывается в лог предупреждением.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
ТаймаутМс | Число | 0 | Общий срок в миллисекундах, 0 — без ограничения |
Возвращает: ОтелРезультатЭкспорта — таймаут, если срок истёк до вызова очередного процессора; иначе неуспешный результат последнего процессора, сообщившего о сбое (исключение процессора — ошибка); иначе успех. Результат процессора Неопределено считается успехом, а значение без метода Успешно (например, Булево) — ошибкой
Закрыть
Закрывает все процессоры цепочки (Shutdown) в пределах общего срока. Закрыть вызывается у каждого процессора — даже после исключения в предыдущем и после истечения срока: тогда процессор получает 1 мс и должен завершиться без ожидания. При ТаймаутМс = 0 Закрыть процессоров вызывается без параметра, и каждый процессор применяет свой таймаут по умолчанию. Неуспешный итог записывается в лог предупреждением.
Своего признака закрытия у композитного процессора нет: повторный вызов снова вызывает Закрыть процессоров, а ПриПоявлении после закрытия по-прежнему передаёт записи процессорам — встроенные процессоры после своего Закрыть записи игнорируют.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
ТаймаутМс | Число | 0 | Общий срок в миллисекундах, 0 — без общего срока |
Возвращает: ОтелРезультатЗакрытия — ошибка, если хотя бы один процессор вернул ошибку или Ложь либо бросил исключение (описания перечислены через ; ); иначе таймаут, если истёк срок или процессор сообщил о таймауте; иначе успех
Внутренние методы
Экспортированы только для вызова из других модулей SDK (в OneScript нет внутренней видимости), приложению вызывать их не нужно:
ЕстьПроцессоры— есть ли в цепочке хотя бы один процессор: без процессоровВключенлоггера возвращаетЛожь;Процессоры— копия списка процессоров цепочки: по ней провайдер сбрасывает буфер и закрывает процессоры.
Пример
// ПакетныйПроцессор - пакетный процессор логов (см. ОтелПакетныйПроцессорЛогов),
// ОтладочныйЭкспортер - второй экспортер логов
Процессоры = Новый Массив();
Процессоры.Добавить(ПакетныйПроцессор);
Процессоры.Добавить(Новый ОтелПростойПроцессорЛогов(ОтладочныйЭкспортер));
Процессор = Новый ОтелКомпозитныйПроцессорЛогов(Процессоры);
// Конструктор провайдера принимает один процессор
Провайдер = Новый ОтелПровайдерЛогирования(Ресурс, Процессор);
Логгер = Провайдер.ПолучитьЛоггер("my-library", "1.0.0");
// Провайдер закрывает композитный процессор, а тот - процессоры цепочки
Провайдер.Закрыть();