Зазначимо: коли лог-файли розростаються до десятків гігабайт, а пошук помилки вручну займає години, централізоване логування стає необхідністю. На одному проєкті з 20 мікросервісами час пошуку причини падіння скоротили з 3 годин до 10 хвилин після впровадження Graylog. Graylog вирішує це завдання: збирає, парсить та аналізує логи з будь-якого джерела — від Laravel-додатку до серверного Nginx. За пару робочих днів ми розгортаємо повний цикл: GELF-прийом, pipelines, дашборди та алерти в Telegram. Наш досвід — 30+ успішних впроваджень без втрати даних при навантаженні до 10 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 годин.







