Напишите ваш телефон
Мы перезвоним в течении 10 минут
Нажимая на кнопку, вы даете согласие на обработку персональных данных и соглашаетесь c политикой конфиденциальности
Анализ 1С Предприятие 7.7 с помощью ELK стека
Рассмотрим систему на базе Elasticsearch, Logstash и Kibana (ELK Stack) для анализа логов 1С Предприятие 7.7 с целью визуализации и анализа событий 1С.
Не зная прошлого, невозможно понять подлинный смысл настоящего и цели будущего. ©Максим Горький
Постановка задачи
Что такое ELK Stack
1. Подготовка
Скопируем логи 1с с Windows сервера на Ubuntu с помощью утилиты rsync, входящей в пакет cygwin.com
apt-get install rsync
uid = user
gid = root
use chroot = yes
max connections = 50
pid file = /var/run/rsyncd.pid
log file = /var/log/rsync.log
[share]
path = /home/files/ # каталог логов
hosts allow = 192.168.0.1 # адрес сервера 1с
hosts deny = *
#list = true
read only = false
#auth users = s1
#secrets file = /etc/rsyncd.secrets
set BACKUP_DIR=E:\1c\complex\syslog\
cd /d %BACKUP_DIR%
C:\cygwin64\bin\rsync.exe -avz --inplace --append --chmod=u=rw --log-file=c:\bat\rsync.log ./*.mlg s1@192.168.100.2::share/1c/
C:\cygwin64\bin\rsync.exe -avz --inplace --append --chmod=u=rw --log-file=c:\bat\rsync.log ./*.mlg s1@192.168.100.2::share/1c/
sending incremental file list
1cv7.mlg
sent 298 bytes received 35 bytes 666.00 bytes/sec
total size is 68,683,437 speedup is 206,256.57
Установка Java на Ubuntu
Подключаем репозиторий с Java 8, обновляем список пакетов и устанавливаем Oracle Java 8.
add-apt-repository -y ppa:webupd8team/java
apt update
apt install oracle-java8-installer
java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
Установка Elasticsearch
Копируем себе публичный ключ репозитория:
# wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -
# apt install apt-transport-https
# echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-6.x.list
apt update
apt-get install elasticsearch
systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl start elasticsearch.service
systemctl status elasticsearch.service
Настройка Elasticsearch
Настройки Elasticsearch находятся в файле /etc/elasticsearch/elasticsearch.yml. На начальном этапе нас будут интересовать следующие параметры:
path.data: /var/lib/elasticsearch # директория для хранения данных
network.host: 127.0.0.1 # слушаем только локальный интерфейс
systemctl restart elasticsearch.service
netstat -tulnp | grep 9200
tcp6 0 0 127.0.0.1:9200 :::* LISTEN 14130/java
Установка Kibana
apt-get install kibana
Добавляем Кибана в автозагрузку и запускаем:
systemctl daemon-reload
systemctl enable kibana.service
systemctl start kibana.service
Проверяем состояние запущенного сервиса:
systemctl status kibana.service
По умолчанию, Kibana слушает порт 5601. Только не спешите его проверять после запуска. Кибана стартует долго. Подождите минуту и проверяйте.
netstat -tulnp | grep 5601
tcp 0 0 127.0.0.1:5601 0.0.0.0:* LISTEN 27401/node
Настройка Kibana
server.host: "0.0.0.0"
После этого Kibana надо перезапустить:
systemctl restart kibana.service
Теперь можно зайти в веб интерфейс по адресу http://ubuntu:5601.
Установка и настройка Logstash
apt-get install logstash
Добавляем logstash в автозагрузку:
systemctl enable logstash.service
Запускать пока не будем, надо его сначала настроить. Основной конфиг logstash лежит по адресу /etc/logstash/logstash.yml его трогать не будем настройки будем по смыслу разделять по разным конфигурационным файлам в директории /etc/logstash/conf.d. Создаем первый конфиг input.conf, который будет описывать прием информации с beats агентов.
input {
beats {
port => 5044
}
}
output {
if [type] == "s1" {
elasticsearch {
hosts => "localhost:9200"
index => "s1-%{+YYYY.MM.dd}"
}
}
else {
elasticsearch {
hosts => "localhost:9200"
index => "unknown_messages"
}
}
#все поступающие данные logstash будет отправлять в системный лог = /var/log/syslog
#Используйте только во время отладки, иначе лог быстро разрастется
#stdout { codec => rubydebug }
}
filter {
if [type] == "s1" {
csv {
separator => ";"
columns => ["date1","time2","user","t1","t2","t3","t4","t5","t6"]
}
mutate {
add_field => {
"timestamp" => "%{date1} %{time2}"
}
# remove_field => ["time1", "time2"]
}
date {
match => ["timestamp", "YYYYMMdd HH:mm:ss"]
target => "@timestamp"
}
if "_dateparsefailure" in [tags] {
drop{}
}
if [t3] in ["ИзмененПроведенный","ЗапускОтчета","ВосстановлениеПоследовательности", "OpenSession", "GrbgRuntimeErr" ] {
# пропускаем обработку этих событий
}
else {
kv {
value_split => ":"
field_split => " ;"
source => "t5"
}
mutate {
convert => { "ВремяВыполнения" => "integer" }
}
}
}
}
systemctl start logstash.service
Установка Filebeat для отправки логов в Logstash
В Debian/Ubuntu ставим так:
apt-get install filebeat
filebeat.inputs:
- type: log
enabled: true
paths:
- /home/files/1c/*.mlg
fields:
type: s1
encoding: "cp1251"
fields_under_root: true
scan_frequency: 5s
output.logstash:
hosts: ["localhost:5044"]
xpack.monitoring:
enabled: true
elasticsearch:
hosts: ["http://localhost:9200"]
systemctl start filebeat
systemctl enable filebeat
Добавление индекса в Kibana
Вы должны увидеть индекс, который начал заливать logstash в elasticsearch. В поле Index pattern введите s1-* и нажмите Next Step. На следующем этапе выберите имя поля для временного фильтра, выбирайте — @timestamp, и жмите Create Index Pattern.Создание индекса с данными
Новый индекс добавлен. Теперь при переходе в раздел Discover, он будет открываться по умолчанию со всеми данными, которые в него поступают.Просмотр логов Elasticsearch в Kibana
Получением логов с linux серверов настроили. Переходим к анализу.Добавляем счетчики в 1С
Добавим две функции, которые будем вызывать для анализа документов, отчетов и обработок. Функции оформим в виде класса *ОбщиеФункции*:
Функция Старт(Конт="") Экспорт
Возврат _GetPerformanceCounter();
КонецФункции
Функция Финиш(ВремяНачала, Конт, Имя="", Док="", ТипСобытия="ВнешняяОбработка") Экспорт
Попытка
Путь = Конт.РасположениеФайла();
Исключение
Попытка
// класс
Путь = Конт.ПолучитьПуть();
Исключение
//Путь = "НеопределеннаяОбработка";
ФормаРасш = СоздатьОбъект("РасширениеФормы");
Попытка
ФормаРасш.УстановитьФорму( Конт );
Путь = ФормаРасш.ПолныйТипОбъекта();
Исключение
Путь = "Модуль";
КонецПопытки;
КонецПопытки;
КонецПопытки;
Время= _GetPerformanceCounter() - ВремяНачала;
Сообщение = "Путь:"+Путь+" ВремяВыполнения:"+Время;
Попытка
Сообщение = Сообщение + " Вид:"+Конт.Вид();
Исключение
КонецПопытки;
Если ПустоеЗначение(Имя)=0 Тогда
Сообщение = Сообщение +" Имя:"+Имя;
КонецЕсли;
ЗаписьЖурналаРегистрации(Сообщение, ТипСобытия, , Док, 3);
Возврат Время;
КонецФункции //Финиш
Процедура ОбработкаПроведения(ВидыДвижений)
оф = СоздатьОбъект("ОбщиеФункции");
t1 = оф.Старт();
...
оф.Финиш(t1, Контекст, "ОбработкаПроведения", ТекущийДокумент(), "Документ");
КонецПроцедуры //ОбработкаПроведения()
Выводы
Ссылки
Фильтры в LogstashСМОТРИТЕ ТАКЖЕ
Если у вас остались вопросы — напишите нам