Skip to content

Набор конфигураций для Logstash и Filebeat для сбора журнала регистрации 1С:Предприятие.

License

Notifications You must be signed in to change notification settings

toreonify/elastic-onec

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

elastic-onec

Набор конфигураций для Logstash и Filebeat для сбора журнала регистрации 1С:Предприятие.

Требования

  • Сервер 1С:Предприятие на базе Windows
  • Elasticsearch 8, Logstash, Filebeat

Известные проблемы

  • На Windows Server 2012 R2 потребление памяти (частный набор) увеличивается со временем, причина не ясна. На Windows 10 проблема отсутствует, потребление памяти уменьшается вплоть до нуля.
  • Может возникнуть состояние гонки между отправкой словарей и записей журнала, т.к. Filebeat не позволяет явным образом сделать задержку (периодичную отправку) вне зависимости от количества данных/событий. Возможно, что увеличение буфера/кэша queue.mem позволит уменьшить вероятность данного события.
  • Скрипт PowerShell может долго запускаться или работать. Скорее всего, что отправку словарей в Logstash следует переписать на C.

Установка

Служба 1cdsend

Служба может быть собрана при помощи компиляторов LLVM/GCC или при помощи Visual Studio. Единственная явная зависимость - bcrypt.lib.

Elasticsearch

  • Создать учетные данные/токены для Logstash и Filebeat с правами записи в индекс/Data Stream onec-log
  • Создать новый индекс с именем onec-log из шаблона запроса elasticsearch/create-index.json (PUT /onec-log) или cоздать новый Data Stream с именем onec-log из шаблона запроса elasticsearch/create-datastream.json (PUT /_data_stream/onec-log)
  • (опционально) Настроить Index Lifetime Policy для удаления/архивирования старых данных

Logstash

  • Создать директорию /var/lib/logstash/onec-map/, задать владельца и группу logstash, задать права на запись владельцу и группе
  • Скопировать conf.d/* и файлы скриптов Ruby из директории logstash в /etc/logstash
  • Убедиться, что созданы отдельные pipeline для conf.d/onec-log.conf и conf.d/onec-map.conf по примеру в файле pipelines.yml
  • Перезапустить службу Logstash

Если вы используете индекс, а не Data Stream, уберите строчку action => "create" из секции output файла onec-log.conf, т.к. она необходима только при отправке данных в Data Stream.

Сервер 1С

Подразумевается, что журнал регистрации находится по пути C:\Program Files\1cv8\srvinfo\reg_1541. Если путь отличается, то необходимо изменить константу LogsPath в скрипте 1CListDb.ps1.

  • Установить Filebeat

  • Скопировать скрипты .ps1 и службу 1cdsend.exe в папку с Filebeat

  • Изменить IP-адрес сервера Logstash в файле 1CSendDictionaries.ps1 в константе LogstashTCPAddress

  • Запустить скрипт .\1CListDB.ps1 -ListDatabases для вывода списка баз данных

  • Запустить скрипт повторно с параметрами .\1CListDB.ps1 -Databases <список названий баз через запятую> -ScriptPath <путь к скрипту 1CSendDictionaries.ps1>

  • Указать полученные значения путей, данные сервера Logstash в конфигурационном файле Filebeat

  • Запустить скрипт PrepareService.ps1 от имени администратора указав с параметрами .\PrepareService.ps1 -ExecutablePath <путь к файлу 1cdsend.exe> -StartupParameters '<список параметров для службы от предыдущего скрипта>' (одинарные кавычки обязательны!)

    Для изменения параметр повторно необходимо указать флаг -Update

  • Проверить наличие службы в оснастке Службы и правильность указанных параметров

FAQ

  • Служба не запускается или не работает, что делать?

    Журнал работы службы и скрипта отправки записывается в журнал "Приложение" Windows.

  • Почему необходима отдельная служба?

    Filebeat не умеет отправлять файлы целиком, он отправляет только построчные изменения. Также, он не отправляет изменения моментально, т.к. имеет буфер/кэш изменений (да, его можно уменьшить). Еще одна причина - он требует символа переноса строки в последней строке, т.е. он не может считать строку от предыдущего символа переноса строки до EOF. Так как словари могут измениться одновременно с записью в журнале регистрации, то необходимо отправить их до того, как Logstash примет записи из журнала регистрации, где используются новые идентификаторы из словарей.

  • Почему отправка списка баз не происходит автоматически?

    Файл списка баз изменяется слишком часто и создает вероятность события, когда onec-translate.rb читает файл списка баз, а он в этот же момент перезаписывается и считывается как пустой. Такое событие случилось около 90 раз в тестировании на рабочих базах и требовало ручного создания записей в Elastic. Возможность отправить через .\1CSendDictionaries.ps1 <путь к 1CV8Clst.lst> вручную оставлена.

Результаты работы

На нескольких рабочих базах по фильтру tags.keyword : "_rubyexception" OR tags.keyword : "_grokparsefailure" из 1 миллиарда записей за год существует 10 с ошибками обработки:

  • некоторые записи при импорте Filebeat решил разделить на два отдельных события, вследствие чего Logstash не смог их обработать
  • некоторые записи не обработаны из-за ошибки сопоставления по словарю/парсингу полей транзакции и т.п. (см. выше про отправку списка баз)
  • четыре записи не обработано из-за недоработки шаблона Grok (не учитывалось количество метаданных; исправлено)
  • одна запись имеет поле метаданных, которое не сопоставилось по словарю (в словаре такой идентификатор был, возможно сервер не отправил его вовремя)

На версии 0.1: Было замечено, что появились записи (100-400+), где не сопоставлен идентификатор пользователя/события/т.п. Проблема кроется том, что Windows может не отправить событие об изменении файла, когда происходит много операций ввода/вывода (на сервере с базой данных это и происходит). Информация о потерянных событиях от ReadDirectoryChangesW есть в интернете. В статье Real-time file monitoring on Windows with osquery описано, что отслеживание можно сделать несколькими способами, но гарантий никто не дает, что событие придет вовремя.

Также, сервер 1С не закрывает дескрипторы файлов словарей сразу после записи, поэтому не изменяется дата изменения файла. Также, ReadDirectoryChangesW не всегда видит такую запись, а постоянное чтение файла и сравнение его содержимого - видит. Даже если в текущий момент времени T, когда изменился файл, программа не увидит изменения, в момент времени T+1 она уже их прочитает, а не будет ждать сигнала от операционной системы (как делает ReadDirectoryChangesW).

На версии 0.2: Способ в лоб, в виде ежесекундного чтения файла, подсчета его контрольной суммы и сравнения с предыдущей, реагирует на изменения быстрее.

Использованные источники

About

Набор конфигураций для Logstash и Filebeat для сбора журнала регистрации 1С:Предприятие.

Topics

Resources

License

Stars

Watchers

Forks