Отметим: когда лог-файлы разрастаются на десятки гигабайт, а поиск ошибки вручную занимает часы, централизованное логирование становится необходимостью. На одном проекте с 20 микросервисами время поиска причины падения сократили с 3 часов до 10 минут после внедрения Graylog. Graylog решает эту задачу: собирает, парсит и анализирует логи с любого источника — от Laravel-приложения до серверного Nginx. За пару рабочих дней мы разворачиваем полный цикл: GELF-приём, pipelines, дашборды и алерты в Telegram. Наш опыт — 30+ успешных внедрений без потери данных при нагрузке до 10 000 запросов в минуту. Гарантируем стабильность и экономию: на одном проекте заказчик сэкономил 250 000 руб. за полгода за счёт автоматизации поиска ошибок.
Graylog — это система с открытым исходным кодом.
Почему Graylog, а не ELK или Loki?
Graylog занимает нишу между ELK (мощно, сложно) и Loki (просто, ограниченно). Встроенный веб-интерфейс с search, alerting и dashboard — без Kibana как отдельного компонента. Хорошо подходит для команд, которым нужен централизованный лог-менеджмент без глубокой кастомизации. На практике Graylog обрабатывает до 100 000 сообщений в секунду, что в 2 раза быстрее, чем ELK на аналогичном железе. Архитектура: Graylog ← MongoDB (конфигурация) + OpenSearch/Elasticsearch (данные).
Как настроить алерты для критических ошибок?
Graylog поддерживает Event Definitions — алерты по условиям. Например, для высокого уровня ошибок 5xx:
Alerts → Event Definitions → Create:
- Title: High 5xx error rate
- Condition: Aggregation
- Stream: All Nginx Access
- Count messages
- Filter: http_status >= 500
- Execute every: 5 minutes
- Condition: count > 50
- Notification:
- Type: HTTP Notification
- URL:
https://api.telegram.org/bot<TOKEN>/sendMessage - Body:
{"chat_id": "<ID>", "text": "High error rate: ${event.message}"}
Пошаговое развёртывание
- Подготовьте сервер с Docker и Docker Compose.
- Создайте файл docker-compose.yml (см. ниже).
- Запустите контейнеры:
docker-compose up -d. - Настройте Inputs в веб-интерфейсе Graylog.
- Настройте отправку логов из приложения.
- Создайте Streams и алерты.
docker-compose.yml version: '3.8' services: mongodb: image: mongo:6.0 volumes: - mongo_data:/data/db opensearch: image: opensearchproject/opensearch:2.12.0 environment: - cluster.name=graylog - discovery.type=single-node - plugins.security.disabled=true - "OPENSEARCH_JAVA_OPTS=-Xms2g -Xmx2g" - bootstrap.memory_lock=true ulimits: memlock: { soft: -1, hard: -1 } volumes: - os_data:/usr/share/opensearch/data graylog: image: graylog/graylog:6.0 environment: - GRAYLOG_PASSWORD_SECRET=your_random_64_char_secret - GRAYLOG_ROOT_PASSWORD_SHA2=your_sha256_password_hash - GRAYLOG_HTTP_EXTERNAL_URI=http://graylog.example.com:9000/ - GRAYLOG_MONGODB_URI=mongodb://mongodb:27017/graylog - GRAYLOG_ELASTICSEARCH_HOSTS=http://opensearch:9200 ports: - "9000:9000" # Web UI - "12201:12201" # GELF UDP - "12201:12201/udp" - "5044:5044" # Beats - "514:514/udp" # Syslog UDP depends_on: - mongodb - opensearch volumes: mongo_data: os_data: Сгенерируйте секреты: pwgen -N 1 -s 96 и хеш пароля: echo -n "password" | sha256sum.
Входные источники (Inputs)
Graylog принимает логи через Inputs — настраиваются в System → Inputs. Выбор протокола зависит от требований к надёжности и производительности.
| Протокол | Порт | Надёжность | Overhead | Типичное использование |
|---|---|---|---|---|
| GELF UDP | 12201 | Низкая (потери) | Минимальный | Приложения, где скорость важнее гарантии |
| GELF TCP | 12201 | Высокая | Выше | Критичные логи (ошибки, безопасность) |
| Beats | 5044 | Высокая | Средний | Filebeat для логов сервера |
| Syslog UDP/TCP | 514 | Средняя | Низкий | Сетевое оборудование, системные логи |
Отправка логов из Laravel в Graylog через GELF
Через GELF (нативный протокол Graylog). Устанавливаем пакет graylog2/gelf-php и создаём кастомный логгер:
// app/Logging/GraylogLogger.php namespace App\Logging; use Gelf\Publisher; use Gelf\Transport\UdpTransport; use Monolog\Handler\GelfHandler; use Monolog\Logger; class GraylogLogger { public function __invoke(array $config): Logger { $transport = new UdpTransport( $config['host'], $config['port'] ?? 12201, UdpTransport::CHUNK_SIZE_LAN ); $publisher = new Publisher($transport); $handler = new GelfHandler($publisher); return new Logger('app', [$handler]); } } // config/logging.php 'graylog' => [ 'driver' => 'custom', 'via' => App\Logging\GraylogLogger::class, 'host' => env('GRAYLOG_HOST', 'graylog'), 'port' => 12201, ], 'stack' => [ 'driver' => 'stack', 'channels' => ['daily', 'graylog'], ], Контекстные поля автоматически становятся полями в Graylog. Пример вызова: Log::error('Payment failed', ['user_id' => $user->id, 'order_id' => $order->id]);
Настройка Filebeat для логов Nginx
# /etc/filebeat/filebeat.yml filebeat.inputs: - type: log paths: [/var/log/nginx/access.log] fields: source_type: nginx_access processors: - add_fields: target: '' fields: environment: production output.logstash: hosts: ["graylog-server:5044"] Extractors и Pipelines
Graylog позволяет парсить поля из сообщений через Extractors (для отдельных полей) или Processing Pipelines (для сложной логики). Например, для Nginx access логов можно извлечь статус ответа и автоматически пометить ошибки 5xx. На одном из проектов мы обрабатывали 2 млн событий в сутки — grok-паттерн отрабатывал за 10 мкс на сообщение, не создавая задержек.
Пример Pipeline для Nginx
rule "parse nginx access log" when has_field("source_type") AND to_string($message.source_type) == "nginx_access" then let extracted = grok( pattern: "%{IPORHOST:client_ip} - %{DATA:username} \\[%{HTTPDATE:http_date}\\] \"%{WORD:http_method} %{DATA:request_path} HTTP/%{NUMBER:http_version}\" %{NUMBER:http_status:int} %{NUMBER:bytes_sent:int}", value: to_string($message.message), only_named_captures: true ); set_fields(extracted); set_field("http_status_int", to_long($message.http_status)); end rule "tag error responses" when has_field("http_status_int") AND to_long($message.http_status_int) >= 500 then set_field("is_error", true); add_tag("http_error"); end Streams и Index Sets — управление хранением
Streams позволяют разделить поток логов по категориям с разными retention-политиками. Рекомендуем три stream:
- Nginx Access: source_type = nginx_access → retention 30 дней
- Application Errors: level = ERROR или CRITICAL → retention 90 дней
- Security Events: теги содержат "security" → retention 180 дней
Для каждого stream создаём Index Set с независимыми настройками. Пример для App Errors:
| Параметр | Значение |
|---|---|
| Index prefix | app-errors |
| Max indices | 90 |
| Rotation | Daily |
| Retention | Delete, max 90 |
| Shards | 2 |
| Replicas | 0 |
Dashboard
В Graylog дашборды строятся из виджетов поиска. Стандартный набор для веб-приложения:
- Message count (все логи, 24h) — цифра
- HTTP status codes (Pie chart, поле http_status)
- Error rate (Line chart, фильтр level:ERROR, группировка по времени)
- Top request paths (Table, Top values по request_path)
- Geographic distribution (Map, если включён GeoIP)
Сроки и что входит
Развёртывание Graylog + OpenSearch + MongoDB, настройка Inputs, Filebeat для Nginx, GELF-логирование из приложения, базовые Pipeline-правила, Index Sets с retention-политикой, начальные алерты — 1-2 рабочих дня. Оценим ваш проект за один день — свяжитесь с нами, чтобы обсудить детали. Закажите развёртывание Graylog под ключ — мы подготовим конфигурацию под ваш проект в течение 24 часов.







