Налаштування логування (Graylog) для веб-застосунку

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.
Розробка та обслуговування будь-яких видів сайтів:
Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Налаштування логування (Graylog) для веб-застосунку
Середня
~3-5 робочих днів
Часті питання
Наші компетенції:
Етапи розробки
Останні роботи
  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1236
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1167
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    865
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1077
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    829
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    844

Налаштування логування (Graylog) для вашого веб-застосунку

Graylog займає нішу між ELK (потужним, складним) та Loki (простим, обмеженим). Вбудований веб-інтерфейс із пошуком, алертингом та дашбордом — без Kibana як окремого компоненту. Ідеально для команд, яким потрібне централізоване управління логами без глибокої кастомізації.

Архітектура: Graylog ← MongoDB (конфігурація) + OpenSearch/Elasticsearch (дані)

Розгортування

# 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
      # echo -n "admin_password" | sha256sum
      - 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:

Генеруйте GRAYLOG_PASSWORD_SECRET:

pwgen -N 1 -s 96

Хешуйте пароль:

echo -n "your_admin_password" | sha256sum | awk '{print $1}'

Вхідні джерела (Inputs)

Graylog отримує логи через Inputs — налаштовуються в System → Inputs:

GELF UDP (рекомендується для застосунків):

  • Port: 12201
  • Можливі втрати при високому навантаженню (UDP), але мінімальний оверхед

GELF TCP (надійніший):

  • Port: 12201
  • Використовуйте якщо критична гарантія доставки

Beats (для Filebeat):

  • Port: 5044

Syslog UDP/TCP:

  • Для системних логів та мережевого обладнання

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

Через GELF (нативний протокол Graylog):

composer require 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,
    'amount' => $order->amount,
    'provider_error' => $response->error,
]);

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 (для складної логіки).

Pipeline для Nginx логів (System → Pipelines):

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 — маршрутизація логів

Streams розділяють потік логів за категоріями з різними політиками збереження:

  • All Nginx Access — source_type = nginx_access → retention 30 днів
  • Application Errors — level = ERROR або CRITICAL → retention 90 днів
  • Security Events — теги містять "security" → retention 180 днів

Кожен stream може мати свій Index Set з незалежними налаштуваннями ротації.

Index Sets — управління зберіганням

System → Index Sets → Create index set:

Index prefix: app-errors
Max number of indices: 90
Index rotation: Time-based, Daily
Index retention: Delete, max 90 indices
Shards: 2
Replicas: 0 (для single-node)

Алерти

Graylog підтримує Event Definitions — алерти на основі умов:

Alerts → Event Definitions → Create:

Title: High 5xx error rate
Condition: Aggregation
  - Stream: All Nginx Access
  - Group by: (none)
  - 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}"}

Дашборд

У 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 з політикою збереження, початкові алерти: 1-2 робочі дні.