Централизованное логирование с ELK Stack для веб-приложений

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Централизованное логирование с ELK Stack для веб-приложений
Сложный
~5 дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1358
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1250
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    956
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    947

Централизованное логирование: почему это критично для веб-приложений

После очередного инцидента на продакшене с 5xx ошибками мы потратили 3 часа, перебирая логи на десяти серверах. Это повторялось каждый месяц. Когда веб-приложение обслуживает тысячи пользователей, логи генерируются в огромных объёмах — до 50 ГБ в день на 10 серверах. Без централизации найти ошибку — как иголку в стоге сена. ELK Stack решает эту проблему: все логи стекаются в единое хранилище с поиском за секунды. В нашей практике время инцидента сокращается на 70% после внедрения ELK. Алерты в Telegram сигналят о 5xx, медленных запросах, ошибках приложения. Мы берём на себя полный цикл: от развёртывания Elasticsearch до дашбордов и алертов. Срок — от 2 до 7 дней в зависимости от сложности.

Как ELK Stack решает проблемы сбора и анализа логов?

ELK — это связка Elasticsearch (хранение и поиск), Logstash (парсинг и трансформация) и Kibana (визуализация). Filebeat доставляет логи с серверов. В результате вы получаете единую точку входа для всех логов, что значительно упрощает мониторинг логов и поиск ошибок.

Выбор схемы: ELK vs EFK vs без Logstash

Схема Сложность Производительность Гибкость
ELK Высокая Средняя Высокая
EFK Средняя Выше Средняя
Без Logstash Низкая Высокая Низкая

Logstash выигрывает в возможностях: парсит старые форматы логов с помощью grok, обогащает данные (geoip, useragent). В 80% проектов используем его. Однако Ingest Pipelines Elasticsearch быстрее: обрабатывает до 15 000 событий/с — в 3 раза больше, чем Logstash (5 000). Но Logstash справляется с неструктурированными данными, где Ingest бессилен.

Как мы настраиваем ELK под ваш проект

Docker Compose для тестового окружения

Используем такой compose-файл:

version: '3.8'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.13.0
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=false
      - ELASTIC_PASSWORD=changeme
      - "ES_JAVA_OPTS=-Xms2g -Xmx2g"
    volumes:
      - esdata:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"
    ulimits:
      memlock:
        soft: -1
        hard: -1
  kibana:
    image: docker.elastic.co/kibana/kibana:8.13.0
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - ELASTICSEARCH_USERNAME=kibana_system
      - ELASTICSEARCH_PASSWORD=changeme
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
  logstash:
    image: docker.elastic.co/logstash/logstash:8.13.0
    volumes:
      - ./logstash/pipeline:/usr/share/logstash/pipeline
      - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
    ports:
      - "5044:5044"
      - "5000:5000"
    depends_on:
      - elasticsearch
volumes:
  esdata:

Logstash Pipeline: парсинг Nginx access и JSON-логов

input {
  beats { port => 5044 }
  tcp { port => 5000; codec => json_lines }
}
filter {
  if [fields][log_type] == "nginx_access" {
    grok { match => { "message" => '%{IPORHOST:client_ip} - %{DATA:user} \[%{HTTPDATE:timestamp}\] "%{WORD:method} %{DATA:request} HTTP/%{NUMBER:http_version}" %{NUMBER:status_code:int} %{NUMBER:bytes_sent:int} "%{DATA:referrer}" "%{DATA:user_agent}" %{NUMBER:request_time:float}' } }
    date { match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]; target => "@timestamp" }
    geoip { source => "client_ip"; target => "geoip" }
    useragent { source => "user_agent"; target => "ua" }
    mutate { remove_field => ["message", "timestamp"] }
  }
  if [fields][log_type] == "app_json" {
    json { source => "message"; target => "app" }
    mutate { remove_field => ["message"] }
  }
}
output {
  if [fields][log_type] == "nginx_access" {
    elasticsearch { hosts => ["http://elasticsearch:9200"]; user => "elastic"; password => "changeme"; index => "nginx-access-%{+YYYY.MM.dd}" }
  } else {
    elasticsearch { hosts => ["http://elasticsearch:9200"]; user => "elastic"; password => "changeme"; index => "app-logs-%{+YYYY.MM.dd}" }
  }
}

Отправка логов из Laravel

Через кастомный Monolog handler:

class LogstashLogger
{
    public function __invoke(array $config): Logger
    {
        $handler = new SocketHandler("tcp://{$config['host']}:{$config['port']}");
        $handler->setFormatter(new JsonFormatter());
        return new Logger('app', [$handler]);
    }
}

Теперь Log::error(...) отправляет JSON напрямую в Logstash.

На одном из проектов с нагрузкой 10 000 RPS мы настроили кластер Elasticsearch из 3 нод с ILM и Logstash с grok-паттернами для парсинга специфичных логов приложения. В результате время поиска ошибки сократилось с 40 минут до 10 секунд. Это позволило команде быстрее реагировать на инциденты и снизить среднее время восстановления (MTTR) на 65%.

Почему ILM обязателен?

Без ILM индексы бесконтрольно растут, и через месяц диск забит. Настраиваем политику: hot (5 ГБ или 1 день) → warm (3 дня) → cold (30 дней) → delete (90 дней). Всё через шаблон индекса. Это основа экономичного хранения логов. Дополнительно можно настроить rollover по размеру или возрасту, чтобы избежать перегрузки узлов.

Производительность Elasticsearch: советы из практики

  • Heap — не более 50% RAM и не более 31 ГБ (из-за compressed oops)
  • Количество шардов: 1 шард ≈ 20–40 ГБ данных. Oversharding — частая ошибка
  • Slow log: index.search.slowlog.threshold.query.warn: 2s
  • Запрет свопа: bootstrap.memory_lock: true

Сравнение: Logstash vs Ingest Pipelines

Параметр Logstash Ingest Pipelines
Производительность ~5 тыс. событий/с ~15 тыс. событий/с
Гибкость Grok, enrich, маршрутизация Только простые парсинги
Сложность Требуется настройка сервера Встроен в ES

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

Что входит в настройку ELK

  • Развёртывание кластера Elasticsearch с оптимальными настройками (шарды, ILM, безопасность)
  • Конфигурация Logstash для парсинга Nginx, PHP и прикладных логов
  • Подключение Filebeat на всех серверах
  • Создание дашбордов в Kibana для мониторинга логов (5xx, latency, traffic)
  • Настройка ILM для экономии дискового пространства
  • Интеграция алертов в Telegram или Email
  • Документация по эксплуатации и обучение команды

Процесс работы

  1. Аналитика — изучаем текущие логи, источники, требования к хранению
  2. Проектирование — выбираем схему (ELK/EFK), намечаем ILM и дашборды
  3. Реализация — развёртываем кластер, настраиваем конвейеры
  4. Тестирование — проверяем поступление данных, алерты, время поиска
  5. Деплой — внедряем в продакшен, передаём документацию

Гарантируем SLA 99.9% для кластера. Наши инженеры имеют опыт более 5 лет и реализовали 30+ проектов. Получите консультацию по настройке ELK под ваш проект. Запланируйте внедрение ELK и сократите время поиска ошибок.

Elasticsearch Guide

Настройка веб-аналитики: GA4, GTM, Яндекс.Метрика и Amplitude

Мы часто видим: конверсия 1.2 %, трафик растёт, а конверсия стоит. Маркетолог смотрит в Google Analytics и говорит: «пользователи уходят с шага 2 оформления заказа». Разработчик открывает тот же шаг — ошибок нет, в Sentry тишина. Значит, дело не в JS-баге, а в UX или в кривых данных, которые показывает аналитика. Аналитика ломается незаметно: событие перестало трекаться после редеплоя — никто не заметил; GTM-тег стреляет дважды — данные задвоились; фильтр GA4 исключает бота, который на самом деле — реальный трафик с корпоративного прокси. Закажите аудит текущих тегов — мы найдём причину за неделю.

После правильной настройки экономия рекламного бюджета может достигать 150 000 ₽ в месяц — это реальный кейс интернет-магазина с 50 000 сессий в день, где дедупликация purchase вернула 20 % неверно приписанных конверсий.

Почему события GA4 дублируются и как это исправить?

Universal Analytics закрыт, его место заняла событийная модель GA4. В ней нет фиксированных хитов страниц и транзакций — только события с параметрами. Это гибче, но требует правильного дизайна событий.

Автоматические события GA4 собирает сам: page_view, scroll, click, session_start. Рекомендуемые события нужно реализовать самостоятельно: purchase, add_to_cart, begin_checkout, view_item. Google ожидает конкретную схему параметров — если передать product_id вместо item_id, данные попадут в GA4, но не в стандартные отчёты e-commerce. Кастомные события для специфики проекта: filter_applied, video_progress, form_step_completed. Кастомные параметры необходимо зарегистрировать в GA4 Admin → Custom definitions, иначе они не будут доступны в отчётах.

Частая ошибка — событие purchase с дублями. Причина: тег срабатывает на странице /thank-you, пользователь обновляет страницу — второй purchase уходит в GA4. Решение: на бэкенде генерируем уникальный transaction_id и передаём в событие. GA4 de-duplicates по нему (в теории — проверяйте через DebugView). Правильная атрибуция экономит до 20 % рекламного бюджета, который раньше уходил на неверно приписанные конверсии.

Как настроить data layer, чтобы не потерять данные?

GTM — инструмент для управления тегами без деплоя кода. Но «без кода» не значит «без архитектуры». Data Layer — основа всего. Передаём данные из приложения в GTM через dataLayer.push(). Структура: event + контекстные данные. Для e-commerce: перед открытием страницы продукта — push с данными товара. GTM-тег читает из dataLayer, не из DOM.

window.dataLayer = window.dataLayer || [];
dataLayer.push({
  event: 'view_item',
  ecommerce: {
    items: [{
      item_id: 'SKU-12345',
      item_name: 'Название товара',
      price: 1990.00,
      currency: 'RUB'
    }]
  }
});

Плохая практика: GTM-тег парсит DOM — ищет цену в span.price, название в h1. Это ломается при любом изменении верстки. Хорошая практика: всегда dataLayer. Используем Preview Mode для отладки и GTM Server-Side для чувствительных данных — отправка с сервера, не с браузера, обходит блокировщики рекламы, не теряет данные.

Как Яндекс.Метрика дополняет веб-аналитику?

Для российской аудитории Метрика обязательна — особенно Вебвизор. Запись сессии пользователя, который бросил корзину, часто даёт ответ быстрее, чем неделя анализа воронки. Цели в Метрике: событийные (через ym(COUNTER_ID, 'reachGoal', 'GOAL_NAME')) или автоматические (клик по кнопке, посещение страницы). Связка с CRM через Метрика Плюс — передача офлайн-конверсий. Наш опыт: в 8 из 10 проектов после настройки Метрики находили скрытые баги в UX, которые не показывали другие системы.

Что даёт product analytics в Amplitude?

Amplitude — продуктовый инструмент, в отличие от маркетинговых GA4 и Метрики. Он заточен под анализ поведения пользователей внутри продукта: воронки, ретеншн, user paths. Amplitude подходит для SaaS-продуктов, мобильных приложений и любых сервисов с зарегистрированными пользователями, где важно понять, как проходят онбординг, на каком шаге уходят, какие фичи используют чаще. Ключевые концепции: identify (связать анонимного пользователя с userId после авторизации), group (аккаунт в B2B SaaS), когорты для удержания. Amplitude Chart — воронка шагов за последние 30 дней с разбивкой по источнику.

Мониторинг качества данных

Аналитика без мониторинга — чёрный ящик. Настраиваем:

  • GA4 Realtime — проверяем после каждого деплоя, что ключевые события приходят
  • Alerting в GA4 — аномалия в количестве событий purchase (резкое падение = что-то сломалось)
  • GTM Preview в staging-окружении перед продакшеном
  • Ручные тесты воронок раз в неделю — просто пройти путь покупателя и проверить, что всё трекается

Что проверяем после каждого деплоя

  • Все ли рекомендуемые события присутствуют в DebugView
  • Нет ли задвоений (считаем количество purchase на 100 сессий)
  • Не изменилась ли структура dataLayer после обновления фронтенда

Что входит в работу

Компонент Описание
Аудит текущих тегов Проверка существующих GTM-тегов, dataLayer, дублей и ошибок
Дизайн событийной схемы Документация: список событий, параметры, триггеры
Настройка GA4 + GTM Создание конфигурации, тегов, Custom definitions
Яндекс.Метрика Установка счётчика, создание целей, настройка Вебвизора
Amplitude (опционально) Настройка клиентского и серверного SDK, когорты
QA и мониторинг Тестирование в Preview Mode, Alerting
Обучение и передача Доступы, инструкция по добавлению новых событий, консоль

Процесс и сроки

  1. Аудит текущих тегов и данных (2 дня)
  2. Дизайн событийной схемы (2 дня)
  3. Разработка Data Layer и настройка тегов (3–5 дней)
  4. QA в Preview Mode и на staging (2 дня)
  5. Деплой и настройка дашбордов (1 день)
Сценарий Срок
Базовая настройка GA4 + GTM 1 неделя
Полный e-commerce tracking + Метрика 2–3 недели
Server-side GTM + Amplitude 3–5 недель

Стоимость рассчитывается индивидуально. Получите консультацию по настройке веб-аналитики для вашего проекта — мы оценим объём работ за один день. Свяжитесь с нами, чтобы начать.

Wikipedia: Веб-аналитика — подробнее о методах и метриках. Официальная документация по событийной модели GA4 доступна в Google Analytics 4.