[DECLAIMER]
- Я в курсе решения от SilverBullet и @lustin. Но момент когда оно было в свободном доступе я упустил, а денег на покупку чего-то, что не нужно бизнесу непосредственно сейчас никто не даст :-(
- Уже сильно позже я прочитал статью @milut "Простейшее использование Elasticsearch для работы с журналом регистрации". И, сравнивая с объемом проделанной работы, я совсем не уверен, что надо было городить такого монстра. Хотя тут можно подогнать базу про "независимость от работы сервера 1С", "меньшую нагрузку на кластер" и "контролируемую загрузку журналов для большого количества баз из одного места"
- Зато если бы у меня была такая штука на прошлом месте работы (немецкая контора, которую аудировал deloitte & touche) - я бы точно представил ее аудиторам как "система хранения аудиторского следа независимая от разработчиков и администраторов 1С". Меня там очень гнобили за отсутствие "аудиторского следа".
Можно рассматривать данную статью как один из вариантов решения или пример хождения по граблям, которое лучше избегать ;-) Итак.
Для начала поставили EventLogLoader Aleksey.Bochkov, настроили загрузку журналов в MS SQL Server и последующую выгрузку в ELK и решили, что всё. Оказалось не всё. Программисты 1С посмотрели и заявили, что работать в этом не будут, т.к. записи журнала идут вперемешку, а они привыкли и готовы работать только со "стандартным журналом". Стало понятно, что загруженные данные надо трансформировать. Кроме тогоEventLogLoader временами подвисал и всё вставало, а чистку загруженных логов все равно надо делать руками
Решили улучшать - собрали группу из трех человек - я, как идеолог, @klimov_andrey как спец по ELK и программист C# и T-SQL Роман и погнали.
Роман переписал EventLogLoader на C# - стало работать без зависаний плюс добавилось удаление загруженных журналов (только для файловых журналов и параллельно я под это дело написал переключатель форматов журналов на Python).
После нескольких итераций, Роман успешно нарисовал трансформацию данных на T-SQL, которая брала данные из таблиц EventLogLoader и преобразовывала все это в формат, который уже был похож на привычный 1С журнал. При трансформации записи накапливались в буфере, чтобы потом собирать несколько штук в единую запись журнала. В процессе очень помогла статья "Формат файлов журнала регистрации 1С 8.1/8.2 - ELF/LOG/LGF/LGP"
Финальным аккордом загрузили все журналы для 35 баз с 2 серверов с января 2018 го года. Теперь оно все в ELK и доступно для поиска. В общем получилась вот такая красота:
Итого как это выглядит с технической точки зрения.
- Все журналы переключены в файловый режим
- Переписанный на C# EventLoader запускается в командной строке (сделать как сервис руки не дошли) и мониторит папку с журналами (для каждой базы стартует свой поток).
- Как только 1С сервер "отпускает" файл, EventLoader забирает его, обрабатывает и выгружает во временные таблицы SQL Server (структура таблиц как у оригинального EventLoader) и удаляет.
- На SQL Server крутится регламентное задание, которое мониторит временные таблицы и собирает записи в "человеческий" вид, ориентируясь на запись о начале (_$Transaction$_.Begin) и о том что транзакция закончилась - зафиксирована (_$Transaction$_.Commit) или отменена (_$Transaction$_.Rollback)
- "человеческие" записи перегружаются в таблицу event2
- В таблицу event2 за записями приходит logtash и забирает их в ELK
- На Kibana cделаy простенький dashboard,который все это красиво визуализирует.
В приложенном архиве:
Солюшен EventLogLoader, который включает всю разработку Aleksey.Bochkov. на VB.Net плюс проект EventLogApp на C# (так же отдельно выложен на github)
database.sql - скрипт создания БД для MS SQL
Для работы трансформации надо создать Job urgent c следующим шагом:
declare @counter int
set @counter = 1
while @counter <= 5
begin
exec up_AddEvents2rowsDirect 100
set @counter = @counter + 1
end