Содержимое Data журнала регистрации
Содержимое поля Data передается в атрибуте v8.eventlog.data: для известных полей — структурированный объект OTLP (kvlistValue), для неизвестной формы — компактная строка JSON, для скаляров — прежнее текстовое значение. Пустой объект также сохраняется строкой JSON, чтобы приемник не потерял его при разворачивании. Известные поля не дублируются отдельной JSON-строкой. v8.eventlog.data.presentation, текст тела лога, ресурсы и метрики сохраняются. Включать настройку не требуется.
Правила разбора разработаны в форке OneSTools.EventLog и проверены на искусственных примерах, сопоставленных с выгрузкой платформы 8.3.27.2325. Имена из синтакс-помощника используются после подтверждения реального расположения полей: порядок перечисления в справке не совпадает с порядком значений LGP. Наличие события в таблице ниже не означает распознавание всех его вариантов. Проверяются код события, маска, количество и типы элементов. Именованные пары распознаются в русском и английском вариантах: Имя / Name, Данные / Data, Ссылка / Reference. На тестовой платформе 8.3.27.2325 язык этих ключей определялся вариантом встроенного языка конфигурации (Russian / English); переключение интерфейса и региональных настроек базы их не меняло.
События описаны декларативным OneScript-кодом в ПоляДанныхСобытийЖурналаРегистрации. Один блок объединяет поля, их типы, формы входной записи и преобразования JSON. Декодер читает готовые описания без ветвлений по кодам событий и именам полей. ИменаПолей, Биты, Способ выводятся из поддерживаемых форм; нераспознаваемые варианты в реестр не включаются. Для совместимости JSON использует AuthenticationMethod и Vendor у ConfigUpdate, как в проверенной выгрузке 8.3.27.
Добавление события
Пример битовой формы аутентификации:
Формы = Новый КонструкторыДанныхЖурналаРегистрации;
Реестр.Событие("_$Session$_.Authentication")
.Аналоги("_$Session$_.AuthenticationError")
.Поле("Name").ТипПоля("Строка").Бит(1)
.Поле("CurrentOSUser").ТипПоля("Строка").Бит(2)
.Поле("AuthenticationMethod").ТипПоля("Число").Бит(9)
.Поле("OSUser").ТипПоля("Строка").Бит(0)
.Форма(Формы.ПоМаске("P", "518"))
.Форма(Формы.ПоМаске("P", "514"))
.Форма(Формы.ПоМаске("P", "513"))
.Зарегистрировать();Поля битовой формы читаются по возрастанию номеров битов. Распознаются только перечисленные маски; новая комбинация сохраняется исходным деревом.
ТипПоля(...) принимает Строка, Число, Булево, Дата, Ссылка, МассивСсылок, МассивСтрок, Незаданное, Таблица. Имя Тип() занято встроенной функцией OneScript. Способ вывода настраивается отдельно:
.Поле("Roles").ТипПоля("МассивСсылок").Пропустить()
.Поле("Roles").ТипПоля("МассивСсылок").Как("UserRoles")
.Поле("Roles").ТипПоля("МассивСсылок").Как("RolesCount", Агрегаты.Количество())
.Поле("Roles").ТипПоля("МассивСсылок").Как("UniqueRolesCount", Агрегаты.КоличествоУникальных())Это четыре альтернативы: исключить из JSON, переименовать с сохранением массива, заменить массив количеством всех или только различных элементов. Агрегаты — экземпляр КонструкторыДанныхЖурналаРегистрации. Пропущенное поле все равно читается и проверяется. .Значение("0", "false").Значение("3", "true") задает карту допустимых значений; неизвестный код приводит к сохранению исходного дерева.
КоличествоУникальных() применяется к массивам строк и ссылок. Строки различаются регистром и пробелами; пустая строка тоже считается значением. Ссылки сравниваются по паре UUID типа и объекта, без учета регистра UUID. Для пустого массива результат "0"; количество передается строкой, как и у Количество(). Счетчик массива и все элементы проверяются до возврата результата. Поврежденное значение сохраняется исходным деревом. Множество уникальных ключей создается только для этого агрегата; обычный подсчет обходится без хранения элементов.
Позиционные формы задаются через Формы.Позиционная("P", "65534"). Второй аргумент — необязательный точный маркер, который не обязательно является битовой маской. Состав и порядок задаются одним из способов:
.ВсеПоля()— порядок объявления полей события..ВсеПоляКроме("DefaultInterface")— поле физически отсутствует во входе; позиции следующих полей сдвигаются. Для нескольких имен допустим CSV или массив..Поля("Name,OSUser")— явный порядок; также принимает массив имен..Поле("Name").Поле("OSUser")— тот же явный порядок цепочкой вызовов.
Для вложенной записи используется Формы.Структура("P") с точным .Размер(...), условиями .РазмерУзла(...), .Литерал(...) и .ПолеПоПути(...). Путь "1.1" означает второй элемент второго списка тела; индексы начинаются с нуля. При регистрации проверяются типы, ссылки на поля, биты, повторные коды событий и выходные ключи JSON. Ошибочное описание не добавляется в реестр.
Подтвержденные формы
| События (суффиксы после системной группы) | Содержимое |
|---|---|
User.AuthenticationLock, AuthenticationUnlock, AuthenticationUnlockError; Session.PasswordRequirementsViolationOnAuthentication | Name, включая пустую строку |
Session.Authentication, AuthenticationError | формы 513, 514, 518: OSUser / Name, CurrentOSUser, AuthenticationMethod |
User.New, Update, NewError, UpdateError | формы 65535 и 65534: свойства пользователя, ссылки на язык/интерфейс, RolesCount, настройки второго фактора и политики паролей |
User.Delete, DeleteError; Session.ConfigExtensionApplyError | Name |
InfoBase.UserPasswordPolicyNew, UserPasswordPolicyNewError, UserPasswordPolicyUpdate | форма 255: девять свойств политики, включая проверку компрометации и действие при нарушении требований |
InfoBase.UserPasswordPolicyDelete, UserPasswordPolicyDeleteError | Name |
InfoBase.ParametersUpdate, ParametersUpdateError | подтвержденные маски параметров базы: пароли, блокировка аутентификации, ожидание блокировки и завершение неактивных сеансов |
InfoBase.AdditionalAuthenticationSettingsUpdate | 45 отдельных масок параметров и форма 2564; методы восстановления и отправки кодов, SMTP, интервалы и проверки компрометации |
InfoBase.ConfigUpdate, DBConfigUpdate, ConfigUpdateError, DBConfigUpdateError | Vendor, Version |
InfoBase.ExclusiveModeChange, ExclusiveModeChangeError | ExclusiveMode |
Access.Access, AccessDenied | таблица Data, либо Right, либо Action и незаданные Data |
InfoBase.SecondAuthenticationFactorTemplateNew, SecondAuthenticationFactorTemplateUpdate, SecondAuthenticationFactorTemplateDelete | Name |
InfoBase.EventLogSettingsUpdate, EventLogSettingsUpdateError | Levels либо EventName, EventIsLogged |
InfoBase.EventLogReduce, EventLogReduceError | Date |
InfoBase.RegionalSettingsChange | 11 свойств региональных установок |
Session.ExternalDataProcessorConnect, ExternalDataProcessorConnectError, ExternalReportConnect, ExternalReportConnectError | путь, имя, безопасный режим, профиль безопасности, защита от опасных действий и язык |
Session.AddInAttach, AddInAttachError | Name, Location, незаданные Type, AttachmentType |
InfoBase.SessionLockChange, SessionLockChangeError | Use, Begin, End, Message, KeyCode, Parameter |
InfoBase.ConfigExtensionUpdate, DBConfigExtensionInsert, DBConfigExtensionInsertError, DBConfigExtensionDelete, DBConfigExtensionDeleteError, DBConfigExtensionUpdate, DBConfigExtensionUpdateError | 15 свойств расширения: имя, версия, поставщик, UUID, хэш, синоним, режимы, профиль, назначение, область и роли |
Data.DataHistorySettingsUpdate, PredefinedDataInitialization, UpdatePredefinedData; InfoBase.PredefinedDataUpdate | таблица Data в подтвержденной именованной форме |
Всего специальные правила охватывают 56 кодов событий. Для остальных возможен общий разбор именованных пар; неподтвержденные формы сохраняются целиком.
Представление значений
Числа и булевы значения в разобранных данных представлены строками ("0", "false"), как в исходном декодере. Это сохраняет точность длинных чисел и единый контракт. Даты — локальные значения 1С yyyy-MM-ddTHH:mm:ss, без добавления часового пояса. Пустая дата сохраняется как 0001-01-01T00:00:00. Пустые строки не удаляются. null означает незаданное поле подтвержденной формы; в общем разборе U сохраняется явно как {"$type":"U"}.
Например, блокировка аутентификации: {"Name":"FixtureUser"}.
Для подтвержденных форм User.New, Update, NewError, UpdateError свойства пользователя находятся прямо в корне объекта, без $format, values и nodes. Состав ролей пользователя намеренно не экспортируется; вместо списка UUID сохраняется RolesCount. Точный состав ролей из телеметрии восстановить нельзя. DefaultRoles расширения остается отдельным полем.
Для остальных позиционных форм используется конверт 1c-positional-data-v1: layout, values, unnamedFields, nodes. Для общих именованных пар — 1c-named-data-v1: values, nodes. Ссылки сохраняют идентификаторы, без попытки прочитать объект из информационной базы. Для неизвестных форм расположение ролей не угадывается: сохраняется исходное дерево. Если маска, число или типы полей неизвестны, возвращается {"$format":"1c-brackets-v1","nodes":[...]}. nodes сохраняет дерево и исходный текст листьев, включая удвоенные кавычки. Переход на новую платформу не приводит к угадыванию полей.
Поиск в Loki
При штатном приеме OTLP Loki разворачивает поля объекта в structured metadata: v8.eventlog.data.Name становится v8_eventlog_data_Name. Эти поля не добавляются в индексные метки и доступны без разбора JSON в запросе. Например:
{service_name="erp"} | v8_eventlog_data_Name="FixtureUser"Loki хранит значения metadata строками: незаданные значения (null) в результатах запросов не отображаются, а массив передается JSON-строкой. Сам OTLP-атрибут сохраняет вложенные объекты, массивы, пустые строки и незаданные значения. Другие приемники могут представлять их иначе. При нормализации имен точки и другие неподдерживаемые символы заменяются на _.
Неизвестные формы по-прежнему находятся в v8_eventlog_data как JSON-строка.
Подставьте service.name своего источника и период журнала. Поля Data следует оставлять атрибутами логов, не добавляя их в индексные метки Loki или в разрезы метрик.
