Логируй больше! 1С + UPD + GELF + Graylog

26.02.19

Администрирование - Мониторинг

Наличие производительной платформы управления логами - это жизненно важный элемент в ландшафте систем с высокой активностью. Рассмотрим один из подходов логирования активности систем на платформе 1С в Graylog.

Думаю, что на сегодняшний день нет необходимости подробно объяснять что такое Graylog. В области управления логами это платформа для централизованного сбора, хранения, индексации и анализа структурированных и не структурированных данных из практически любых источников.

Вопрос управления логами становится все более острым и для систем на платформе 1С:Предприятие , т.к. области их применения, объемы обрабатываемых данных и нагрузки растут. Встроенная в платформу 1C подсистема логирования не всегда удовлетворяет критериям скорости, архитектуры и удобства использования, а так же требует использования сторонних средств для более глубокого анализа и визуализации.

Рассмотрим достаточно простой способ реализации логирования действий/событий/ошибок и т.д. в Graylog для решений на плафторме 1С:Предприятие. Возможно, он больше подходит для кастомных решений, либо типовых решений, для которых допустима кастомизация, но от этого не теряет своей актуальности.

Исходим из того, что:

- в нашей инфраструктуре уже развернут Graylog-кластер (примеры статья для версии 2.4, но на текущий момент уже доступна версия Graylog 3.0);

- у нас есть доступ к Graylog правами администратора;

- для передачи по UDP используем замечательную ВК от Сергея Serginio Смирнова;

Способов интеграции с Graylog достаточно много. Нас интересует предоставляемое API, протокол передачи данных UDP и формат GELF (Graylog Extended Log Format). Почему UDP, а не HTTP, думаю, понятно, хотя возможность передачи GELF-сообщений по HTTP так же есть.
Создадим новый GELF UDP Input: в консоли Graylog System -> Inputs -> Select input: GELF UDP -> Launch new input

SystemInputs

 

LaunchNewGELFUDPInput

 

Input запущен и готов к работе:

InputCreated


Статичные поля могут быть добавлены дополнительно (например, для разделения по стримам). Не забываем проверять доступность портов на проксях/шлюзах/бранмаурэрах и т.д. и т.п.


В документации Graylog формат GELF и его ограничения хорошо описаны. Ограничимся тем, что GELF-сообщение - это данные в JSON-формате, содержащие набор обязательных, не обязательных и произвольных полей.
Предположим, что мы логируем входящий/исходящий http-трафик нашей системы. Тогда пример структуры GELF-сообщения может иметь вид:

//    GELF-сообщение
//
Функция ПолучитьСтруктуруЗаписиЛога() Экспорт
        
    СтруктураЗаписиЛога = Новый Структура;        
    
    // обязательные поля
    СтруктураЗаписиЛога.Вставить("version", "1.1");
    СтруктураЗаписиЛога.Вставить("host", ИмяКомпьютера());
    СтруктураЗаписиЛога.Вставить("short_message", "");
    СтруктураЗаписиЛога.Вставить("full_message", "");    
    СтруктураЗаписиЛога.Вставить("level", 6);        
    
    // произвольные поля
    СтруктураЗаписиЛога.Вставить("_systemName", ИмяТекущейБазы());        // имя текущей системы
    СтруктураЗаписиЛога.Вставить("_baseUrl", "");                        // базовый URL запроса
    СтруктураЗаписиЛога.Вставить("_relativeUrl", "");                    // относительный URL запроса
    СтруктураЗаписиЛога.Вставить("_requestHeaders", "");                // заголовки запроса
    СтруктураЗаписиЛога.Вставить("_requestBody", "");                    // тело запроса
    СтруктураЗаписиЛога.Вставить("_responseResult", "");                // результат ответа (технологическое поле)
    СтруктураЗаписиЛога.Вставить("_responseStatusCode", "");            // код состояния http
    СтруктураЗаписиЛога.Вставить("_responseHeaders", "");                // заголовки ответа
    СтруктураЗаписиЛога.Вставить("_responseBody", "");                    // тело ответа    
    СтруктураЗаписиЛога.Вставить("_duration", "");                        // длительность обработки http-вызова
    СтруктураЗаписиЛога.Вставить("_logType", "");                        // тип лога: innerRequest-входящий вызов; outerRequest-исходящий вызов
    СтруктураЗаписиЛога.Вставить("_messageType", "");                    // произвольный тип сообщения
    СтруктураЗаписиЛога.Вставить("_objectUid", "");                        // UID объекта базы, с которым может быть связан текущий вызов
    СтруктураЗаписиЛога.Вставить("_objectType", "");                    // тип объекта базы, с которым может быть связан текущий вызов
    
    Возврат СтруктураЗаписиЛога;
    
КонецФункции

 

Сформируем новое сообщение лога:

//
//
Функция ПолучитьЗаписьЛогаHTTPЗапроса(ТипЗаписиЛога, БазовыйURL = "", ОтносительныйURL = "", ЗапросЗаголовки = "", ЗапросТело = "", ОтветЗаголовки = "", ОтветТело = "", КодСостояния = 200, Результат = 1, Объект = "", Длительность = 0, УровеньСообщения = 6) Экспорт
        
    СтруктураЗаписиЛога = ПолучитьСтруктуруЗаписиЛога();        
        
    ОбъектУникальныйИдентификатор = ?(ЗначениеЗаполнено(Объект), СокрЛП(Объект.УникальныйИдентификатор()), "");    
    ОбъектТип = СокрЛП(ТипЗнч(Объект));    
        
    СтруктураЗаписиЛога.short_message = Лев(БазовыйURL, 200);
    СтруктураЗаписиЛога.full_message = Лев(БазовыйURL, 400) + ?(ЗначениеЗаполнено(ОтносительныйURL), "/" + Лев(ОтносительныйURL, 200), "");    
    СтруктураЗаписиЛога.level = УровеньСообщения;        
    
    СтруктураЗаписиЛога._logType = ТипЗаписиЛога;        
    СтруктураЗаписиЛога._baseUrl = БазовыйURL;
    СтруктураЗаписиЛога._relativeUrl = ОтносительныйURL;
    СтруктураЗаписиЛога._requestHeaders = ЗапросЗаголовки;
    СтруктураЗаписиЛога._requestBody = ЗапросТело;            
    СтруктураЗаписиЛога._responseResult = Результат;
    СтруктураЗаписиЛога._responseStatusCode = КодСостояния;
    СтруктураЗаписиЛога._responseHeaders = ОтветЗаголовки;
    СтруктураЗаписиЛога._responseBody = ОтветТело;        
    СтруктураЗаписиЛога._objectUid = ОбъектУникальныйИдентификатор;
    СтруктураЗаписиЛога._objectType = ОбъектТип;    
    СтруктураЗаписиЛога._duration = Длительность;    
    
    Возврат СтруктураЗаписиЛога;
    
КонецФункции

 

Выполним отправку сообщения:

ВнешняяСистемаЛогирования = Новый Структура("Сервер, Порт", "graylog.mydomain", 15555);
СтруктураЗаписиЛога = ПолучитьЗаписьЛогаHTTPЗапроса(ТипЗаписиВнешнегоЛога_ВходящееСообщение(), БазовыйURL, ОтносительныйURL, ЗапросЗаголовки, ТелоЗапроса, ОтветЗаголовки, ОтветТело, КодСостояния, Результат, ДлительностьВыполнения);
ВыполнитьЗапросUDP(ВнешняяСистемаЛогирования, JSON(СтруктураЗаписиЛога));

 

Определение используемых методов:

//
//
Функция JSON(Структура)Экспорт

    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();    
    ЗаписьJSON.ПроверятьСтруктуру = Ложь;
    ЗаписатьJSON(ЗаписьJSON, Структура);
    Возврат ЗаписьJSON.Закрыть();

КонецФункции

//
//
Функция ВыполнитьЗапросUDP(Настройки, ТелоЗапроса, КодировкаСообщения = "utf8") Экспорт
    
    ОписаниеОшибки = "";
    
    Попытка
                
        NetObjectToIDispatch = Новый COMОбъект("NetObjectToIDispatch45");    
                
        udpClient  = NetObjectToIDispatch.СоздатьОбъект("System.Net.Sockets.UdpClient");    
        
        Хост = Настройки.Сервер;
        Порт = Настройки.Порт;        
                
        Если НРег(КодировкаСообщения) = "utf8" Тогда 
            SystemTextEncoding = NetObjectToIDispatch.ПолучитьТип("System.Text.Encoding").UTF8;
        ИначеЕсли НРег(КодировкаСообщения) = "unicode" Тогда 
            SystemTextEncoding = NetObjectToIDispatch.ПолучитьТип("System.Text.Encoding").Unicode;
        Иначе
            SystemTextEncoding = NetObjectToIDispatch.ПолучитьТип("System.Text.Encoding").ASCII;
        КонецЕсли;
        sendBytes = SystemTextEncoding.GetBytes(СтрЗаменить(СтрЗаменить(ТелоЗапроса, Символы.ВК, " "), Символы.ПС, " "));    
        
        udpClient.Send(sendBytes, sendBytes.getLength(), Хост, Порт);                
        
        udpClient.Close();        
        
    Исключение
        
        ОписаниеОшибки = ОписаниеОшибки();
        Сообщить(ОписаниеОшибки);        
        
    КонецПопытки;
    
    NetObjectToIDispatch = Неопределено;
    udpClient = Неопределено;
    SystemTextEncoding = Неопределено;
    sendBytes = Неопределено;
    
КонецФункции

//
//
Функция ТипЗаписиВнешнегоЛога_ВходящееСообщение() Экспорт Возврат "innerRequest"; КонецФункции

//
//
Функция ТипЗаписиВнешнегоЛога_ИсходящееСообщение() Экспорт Возврат "outerRequest"; КонецФункции


В результате получаем данные в Graylog, наслаждаемся и используем платформу для разбора инцидентов, сбора аналитики и т.д. и т.п.

graylogExample

 

По сути данный подход реализует ту же функцию отправки данных в грэйлог, которую экранируют агенты, типа logstash, NXlog и т.д.
 

Graylog UDP логирование GELF

См. также

Журнал регистрации Мониторинг Системный администратор Программист Бизнес-аналитик Руководитель проекта Платформа 1С v8.3 Платные (руб)

В сферу обязанностей при работе с клиентами входит контроль работы баз данных и серверов 1С. Нужно понимать что происходит в базах, есть ли ошибки, зависания у пользователей и фоновых задач, блокировки или какое-то необычное поведение системы, получение информации о причинах возникновения проблем и их оперативное устранение и т.д. В качестве источников информации использую консоль кластеров 1С, технологический журнал 1С, журналы регистрации базы 1С. Для автоматизации части операций мониторинга и анализа создал инструмент на основе 1С.

9000 руб.

28.08.2019    34063    22    21    

75

SALE! 50%

Учет доходов и расходов Логистика, склад и ТМЦ Маркетплейсы Мониторинг Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Расширение модуля Synchrozon для удобного контроля габаритов на Ozon! Разработка позволяет мгновенно сравнивать установленные габариты товаров, с габаритами, указанными на Ozon, чтобы выявлять любые несоответствия. Поможет сократить расходы на логистику, гарантируя, что все данные о товарах остаются точными и актуальными.

3600 1800 руб.

31.10.2024    365    1    0    

3

Мониторинг Системный администратор Программист Платформа 1С v8.3 Россия Платные (руб)

Обработка позволяет использовать подобные КОРП-функциональности механизмы контроля расхода памяти (сеансом на 1 вызов и рабочими процессами), реагируя завершением "тяжелых" вызовов, перезапуском рабочих процессов при чрезмерном потреблении этого важного ресурса.

3600 руб.

03.05.2023    5150    3    0    

4

SALE! 50%

Логистика, склад и ТМЦ Мониторинг Маркетплейсы Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Платные (руб)

Расширение для 1С, которое автоматически «отлавливает» тарифы складов с наиболее выгодными коэффициентами для ваших товаров на маркетплейсе Wildberries. С помощью этого инструмента вы сможете легко находить и выбирать склады с лучшими условиями для максимизации своей прибыли. Удобная интеграция позволяет настроить регулярный поиск складов по выгодным коэффициентам в виде регламентного задания в 1С, что существенно экономит время и автоматизирует процесс принятия решений по размещению товаров. Всегда будьте на шаг впереди конкурентов и повышайте эффективность своего бизнеса с помощью «Ловца коэффициентов складов Wildberries»!

3600 1800 руб.

14.11.2024    310    1    0    

4

Мониторинг Инструменты администратора БД Системный администратор Платформа 1С v8.3 Россия Платные (руб)

Конфигурация Session Monitor предназначена для мониторинга сервера 1С с целью отслеживания чрезмерной нагрузки от конкретных сеансов и скорости реакции рабочих процессов.

1500 руб.

01.12.2020    16046    38    0    

56

Мониторинг Анализ продаж Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Розница 3.0 Управленческий учет Платные (руб)

Решение для управления ключевыми показателями компании, обеспечивающее гибкую настройку, визуализацию данных и эффективный контроль за достижением целей. Продукт сокращает трудозатраты на расчет и аналитику, позволяя быстрее принимать обоснованные решения. Легко интегрируется в любую конфигурацию 1С, предлагая интуитивный интерфейс, удобный для всех пользователей.

24000 руб.

11.11.2024    231    0    0    

0

Мониторинг Сервера Системный администратор Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

StartPlus и система контроля и сбора информации (настраиваем за час и пользуемся). Данное решение позволяет быстро собирать и анализировать различную информацию из разных источников данных (не обязательно серверов 1С). В любой момент можно менять состав сводной информации без сложной разработки на стороне 1С.

1 стартмани

18.07.2024    875    7    moolex    0    

5

Мониторинг Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Решение для автоматического отслеживания нагрузки на кластеры 1С различных версий, автоматического удаления сеансов по показателям кластера, удаления сеансов по показателям через телеграм бота, мониторинга журнала регистрации с возможностью блокирования входов и сброса сеансов для пользователей инициаторов событий, получение анализа ошибок журнала регистрации в телеграм.

1 стартмани

13.06.2024    5038    38    Garilia    3    

38
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. KereberoS 3 27.02.19 05:26 Сейчас в теме
Статья начинается с чудесной фразы: "Думаю, что на сегодняшний день нет необходимости подробно объяснять что такое Graylog".
Зачем в таком случае писать о Грейлог, если "об этом нет необходимости объяснять"?
Merkalov; Panadol; +2 Ответить
4. Lars Ulrich 625 27.02.19 09:59 Сейчас в теме
(1) На Пулитцера не претендую, была цель донести реализацию.
Если Вы знали, как готовить Graylog, то объяснять действительно не нужно. Ну а если НЕ знали, но заинтересовались, то дополнительная цель достигнута :)
2. nicxxx 255 27.02.19 07:57 Сейчас в теме
Одно дело знать, другое-уметь использовать
3. Scorpion4eg 435 27.02.19 09:43 Сейчас в теме
Чуть-чуть добавлю. У Graylog есть очень удобный механизм распределения общего потока сообщений на streams. А уже на этот stream можно навесить алерты, в т.ч. в slack.
Мы так пока следим за ошибками в модулях.
Ловишь исключение, получаешь сообщение в slack. В истории алертов находишь сообщение. По трек номеру сессии смотришь - а что пользователь делал, чтобы все сломать.
Stalker27; acanta; Lars Ulrich; +3 Ответить
5. comol 5109 27.02.19 11:07 Сейчас в теме
Статья огонь. Вопросы по теме:
в чем преимущество GELF формата?
Объём логов? Скорость записи? Скорость поиска?
6. Scorpion4eg 435 27.02.19 11:41 Сейчас в теме
(5) Грубо говоря - ни в чем. GELF - Graylog Extended Log Format.
Это просто один из форматов, которые поддерживает Graylog и кастомные логи проще всего в нем слать
7. comol 5109 27.02.19 11:48 Сейчас в теме
(6) В плане убирания ЖР в graylog в этом случае что мы выиграем?...
Ещё что-то слышал про проксирование и формирование очереди через graylog... Если поток событий больше чем может переварить СУБД для хранения логов. Ну или если в СУБД для хранения логов нужно запись организовывать пакетно. Или вы только GELF формат у себя используете? А clickhouse graylog не поддерживает не в курсе?
8. Scorpion4eg 435 27.02.19 11:59 Сейчас в теме
(7) Здесь не подскажу. Если не ошибаюсь Graylog опирается на mongodb.
Я не проксирую поток логов. У меня совсем отдельная история. Нашей команде потом логов, так чтобы не справлялась СУБД даже близко не получить.

Но думаю можно завернуть поток логов на связку logstash-rabbitMQ-Graylog. Logstash умеет преобразовывать в gelf, а RabbitMQ возьмет на себя роль балансировщика. Ну и graylog умеет масштабироваться горизонтально - выделить несколько нод на сбор логов.
9. comol 5109 27.02.19 12:14 Сейчас в теме
(8)
Нашей команде потом логов, так чтобы не справлялась СУБД даже близко не получить.


А вот тут можно подробнее? Ведь если лог-и собираются, то либо для поиска по ним чего-то либо для анализа...
И в том и в том случае у вас СУБД, даже если она просто индексирует текстовые файлики. Ведь если там реально нереальный объём их надо индексировать?...

СУБД не справится даже если оно поверх spark/hadoop или это что-то ооочень многонодное и кластеризованное?
"не верю" (с).

И как, кстати, вы умудрились получить в 1С такой поток логов что не справятся специализированные инструменты?
10. Scorpion4eg 435 27.02.19 12:19 Сейчас в теме
(9) Так. Похоже мы запутались.
1. Логи собираем для того чтобы, быстро разбираться с исключениями на проде.
2. У нас нет огромного потока логов. Я бы сказал что у нас наоборот очень скромный поток.
3. Graylog я решил использовать, потому что а) неперевариваю Kibana б) не хочу писать запросы в Clickhouse для анализа ситуаций в) хочу иметь удобный, гибкий и быстро настраиваемый сервис уведомлений о факапах
Stalker27; u2b; comol; +3 Ответить
11. acsent 1204 07.03.19 12:53 Сейчас в теме
сами ошибки транслируете из ЖР? или тех журнал?
12. Lars Ulrich 625 11.03.19 18:17 Сейчас в теме
(11) У нас в ЖР кроме критичных ошибок больше ничего не пишется. Интеграционные логи фактически внешние.
13. acsent 1204 12.03.19 17:35 Сейчас в теме
(12) Те вы сразу сами пишите во внешний лог?
15. Lars Ulrich 625 12.03.19 21:56 Сейчас в теме
(13) Да, сразу во внешний лог.
14. herfis 513 12.03.19 17:45 Сейчас в теме
Предлагается писать лог напрямую во внешний лог-агрегатор внешней компонентой через сетку??
Нууууу, такое.... Базовое логирование таким не заменишь. Собирать какие-то маркеры - можно, в принципе... Но зачем в онлайн упираться?
Стоп, туплю. Это ж просто удобный способ донести данные из любого источника (тех же первичных логов). Тогда ок. Плюсанул.
16. asved.ru 36 07.11.19 08:34 Сейчас в теме
2084 год. Искусственный интеллект на базе платформы 1C:Universe 128.256.512.65536 все еще поддерживает COM-объекты в силу низкого порога вхождения для разработчика.
DimaP; user612295_death4321; +2 Ответить
Оставьте свое сообщение