Проблемы 1С-ных подходов к логированию:
Журнал регистрации:
- жёстко заданная структура
- проблемы с производительность при чтении и записи большого количества данных (проблемы проявляются в той или иной степени в зависимости от выбранного формата ЖР)
Регистр сведений:
- логи занимаю много места в базе
- один неаккуратный запрос (например выборка за пару месяцев) может просадить производительность всей системы
- данные нужно обслуживать - архивировать, удалять ненужные
- реляционная база данных не предназначена для хранения логов
Файлы логов:
- отсутствие стандартизации в формате хранения
- ручной или полуручной анализ, обработка и обслуживание логов
- проблемы параллельной записи в файл
Elasticsearch
Elasticsearch – это мощный поисковый движок, написанный на JAVA и позволяющий организовать эффективный поиск в базе данных. Для управления и работы с данными в системе используется REST API. Из коробки Elasticsearch предоставляет богатый функционал для загрузки данных из разных источников, обработки, анализа, репликации и масштабируемости системы.
Совместно с Elasticsearch поставляется система визуализации данных Kibana с веб интерфейсом.
Подробно на процессе установки останавливаться не будем. Перейдем сразу к интеграции с 1С.
Подсистема "Логирование"
Подсистема предоставляет программный интерфейс для записи произошедших событий, выгрузки событий, создания индексов, создания политик жизненного цикла и поиска по выгруженным данным. Для просмотра логов в пользовательском режиме 1С используется обработка "Просмотр логов".
Ниже описаны объекты подсистемы.
Справочники
- “Серверы логирования” - определяет инстанс ElasticSearch
- “Ноды эластик” - определяет настройки подключения к серверам, подчинён справочнику “Серверы логирования”
- “Индексы логов” - определяет настройки и структуру хранения данных, подчинён справочнику “Серверы логирования”
- “Политики жизненного цикла” - определяет настройки управления размещением и временем жизни данных, подчинён справочнику “Серверы логирования”
Константы
- "Индекс журнала регистрации" - определяет индекс, используемый для выгрузки журнала регистрации
Регистры сведений
- "Данные логов" - хранит записи событий в формате JSON, подготовленные для выгрузки
- "Состояния индексов" - хранит данные о синхронизации с ElasticSearch
- "Состояния нод" - хранит данные о состоянии нод
Регламентные задания
- "Выгрузить лог в эластик" - выгружает и очищает записи регистра "Данные логов" за прошлые часы
- "Выгрузить журнал регистрации в эластик" - выгружает данные журнала регистрации в индекс, заданный в константе "Индекс журнала регистрации"
- "Обновить состояние нод" - определяет работоспособность нод
Обработки
- "Просмотр логов" - предоставляет возможность просматривать выгруженные логи
Связь сущностей 1С и ElasticSearh
Инстанс ElasticSearch представляет из себя кластер рабочих серверов - нод. В простом случае в кластере может быть одна нода, но для работы встроенного механизма репликации и отработки отказа их должно быть минимум две. В сложных случаях ноды также делятся по ролям (Master, Data, Coordinator и т.д.).
Данные в ElasticSearh хранятся в индексах. Для удобства обслуживания индексы разбиваются на части:
- по датам (дням, месяцам) при использовании ручного управления
- по номерам в автоматическом режиме при использовании политик жизненного цикла (Index Lifecycle Policies)
Для запроса сразу по нескольким индексам Elasticsearch предоставляет псевдонимы индексов (Aliases). А для автоматического создания и настройки индекса поддерживает шаблоны индексов.
Для автоматического управления расположением индексов на дисках и сроком жизни в Elasticsearch используются политики жизненного цикла (Index Lifecycle Policies). В политике могут быть заданы ограничения по размеру индекса или по времени. После наступления ограничения индекс перемещается на следующую стадию. Всего определены четыре стадии:
- hot - новые данные, активная запись, активное чтение
- warm - данные в режиме read-only, активное чтение
- cold - редкое чтение
- delete - данные больше не нужны, удаление
Структура индексов ElasticSearch
Индексы в ElasticSearch состоят из осколков (Shards) и реплик (Replicas). Осколки представляют из себя основную структуру хранения данных и могут быть распределены по разным нодам. От количества осколков зависит скорость чтения и записи данных, а также занимаемое место на дисках. Реплики это копии осколков доступные только для чтения. Количество осколков и реплик задаётся при создании индекса или берётся из шаблона индекса.
Для примера возьмём две ноды, индекс с пятью осколками и одной репликой.
Первая нода будет содержать три первичных осколка (1,2,3) и две реплики (4,5)
____ ____ ____ ____ ____
| 1 | | 2 | | 3 | | 4R | | 5R |
|____| |____| |____| |____| |____|
Вторая нода будет содержать два первичных осколка (4,5) и три реплики (1,2,3)
____ ____ ____ ____ ____
| 1R | | 2R | | 3R | | 4 | | 5 |
|____| |____| |____| |____| |____|
В таком случае при отказе одной из нод данные останутся доступными.
Создание индексов в 1С
Для определения нового типа логов в 1С нужно создать элемент справочника "Индексы логов", заполнить наименование, сервер ElasticSearch, количество осколков, количество реплик и политику жизненного цикла.
При записи нового справочника в ElasticSearch создаётся шаблон с настройками и алиас для доступа к данным.
После этого индекс должен быть инициализирован с помощью выгрузки логов из 1С. При этом ElasticSearch сам подбирает необходимые типы свойств в зависимости от выгружаемых данных.
После инициализации есть возможность загрузить структуру индекса и определить способ отображения данных на стороне 1С.
Запись логов в 1С
Для временного хранения произошедших событий в 1C используется регистр сведений "Данные логов". Запись в регистр выполняется процедурой ЗаписатьЛог общего модуля ЛогированиеНаСервере.
// Регистрирует произошедшие в сисетме события
//
// Параметры:
// Индекс - СправочникСсылка.ИндексыЛогов
// КоллекцияДанных - ТаблицаЗначений, Массив - Данные событий в произвольном формате
//
Процедура ЗаписатьЛог(Индекс, КоллекцияДанных) Экспорт
Переданная коллекция логов сериализуется средствами платформы в JSON. При этом типы данных, не поддерживающие автоматическую сериализацию приводятся к типу "Строка". Для ссылочных типов выгружается уникальный идентификатор.
Подготовленные к обмену данные записываются с разделением по началу часа времени записи.
Выгрузка логов из 1С в ElasticSearch
Выгрузка логов выполняется регламентными заданиями:
- "Выгрузить лог в эластик"
- "Выгрузить журнал регистрации в эластик"
Для выгрузки данных в ElasticSearch используется API массовых операций.
POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "index" : { "_index" : "test", "_id" : "2" } }
{ "field1" : "value2" }
В случае успеха обновляется дата выгрузки в регистре сведений "Состояния индексов".
Просмотр логов в 1С
Для просмотра в 1С выгруженных данных используется обработка "Просмотр логов". На форме указывается индекс, количество запрашиваемых записей, отборы по полям и сортировка.
Для получения данных в ElasticSearch используется операторы Search API:
- match_phrase - для полнотекстового поиска
- range - для определения диапазона дат
POST journal/_doc/_search
{
"from":0,
"size":200,
"query":
{
"bool":
{
"must":
[
{
"range":
{
"Дата":
{
"gte":"2020-07-06T21:00:00Z",
"lte":"2020-07-07T20:59:59Z"
}
}
},
{
"match_phrase":
{
"ПредставлениеСобытия":"Транзакция. Начало"
}
},
{
"match_phrase":
{
"Транзакция":"08.07.2020 14:14:49 (77473)"
}
}
]
}
},
"sort":
{
"Дата":
{
"order":"desc"
}
}
}
Заключение
Стек ELK представляет из себя мощный набор инструментов для эффективного решения широкого спектра задач сбора, хранения и анализа данных.
В статье дано поверхностное описание ElasticSearch и предоставлен вариант интеграции с 1С.
Во вложении доступна конфигурация с подсистемой "Логирование". Тестировалась на платформе 8.3.13.1690.