← Назад к вопросам

Как отправить логи в Kibana?

1.8 Middle🔥 131 комментариев
#Инфраструктура и DevOps

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Отправка логов в Kibana: архитектура и практическая реализация

Kibana — это не система приема логов, а визуализационный интерфейс и инструмент анализа. Сама отправка данных осуществляется в Elasticsearch, который является ядром стека ELK (Elasticsearch, Logstash, Kibana) или Elastic Stack. Kibana затем подключается к Elasticsearch для отображения и анализа этих данных. Для отправки логов из PHP-приложения используется связка агентов/шипперов (shippers) и, часто, парсер/агрегатор (Logstash).

Ключевые компоненты архитектуры

  1. Elasticsearch: распределенная поисковая и аналитическая база данных (NoSQL), которая хранит, индексирует и позволяет выполнять поиск по логам.
  2. Logstash: серверный конвейер для обработки данных. Принимает логи из множества источников, трансформирует их (парсинг, обогащение, фильтрация) и отправляет в Elasticsearch.
  3. Filebeat (или другие Beats): легковесный агент, устанавливаемый на сервер с приложением. Его задача — собирать логи из файлов и отправлять их дальше (часто в Logstash).
  4. Kibana: веб-интерфейс для визуализации (дашборды, графики) и анализа данных из Elasticsearch.

Таким образом, типичный поток данных: PHP-приложение -> Файл лога / Syslog -> Filebeat -> Logstash -> Elasticsearch -> Kibana.

Практические способы отправки логов из PHP

1. Классический способ: логирование в файл с последующей отправкой через Filebeat+Logstash

Это наиболее надежный и производительный подход для production-среды. Логика приложения отделена от транспорта логов.

Шаг 1: Настройка логирования в PHP (используем Monolog)

Устанавливаем библиотеку:

composer require monolog/monolog

Конфигурация логгера:

<?php
// index.php или в bootstrap-файле
require 'vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Formatter\JsonFormatter;

// Создаем канал логов
$log = new Logger('application');

// Создаем обработчик, который пишет в файл
$streamHandler = new StreamHandler(__DIR__.'/logs/app.log', Logger::DEBUG);

// Используем JsonFormatter для структурированного вывода
// Это КРИТИЧЕСКИ важно для последующего парсинга в Logstash
$formatter = new JsonFormatter();
$streamHandler->setFormatter($formatter);

$log->pushHandler($streamHandler);

// Пример записи лога с контекстом
$log->info('Пользователь авторизовался', [
    'user_id' => 12345,
    'ip' => $_SERVER['REMOTE_ADDR'],
    'endpoint' => $_SERVER['REQUEST_URI']
]);

$log->error('Ошибка подключения к БД', [
    'error_message' => $e->getMessage(),
    'connection_string' => 'mysql:host=localhost;dbname=test'
]);

Шаг 2: Настройка Filebeat (filebeat.yml)

filebeat.inputs:
- type: filestream
  enabled: true
  paths:
    - /var/www/your-app/logs/app.log
  json.keys_under_root: true # Парсим JSON строки
  json.add_error_key: true

output.logstash:
  hosts: ["logstash-host:5044"]

Шаг 3: Настройка Logstash конфигурации (logstash.conf)

input {
  beats {
    port => 5044
  }
}

filter {
  # Дополнительная обработка, если нужно
  date {
    match => [ "timestamp", "ISO8601" ]
  }
  mutate {
    remove_field => [ "host", "@version" ]
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "php-app-%{+YYYY.MM.dd}"
    user => "elastic"
    password => "your_password"
  }
}

2. Прямая отправка в Elasticsearch из PHP (не для production)

Для разработки или низконагруженных систем можно отправлять логи напрямую, но это создает нагрузку на приложение и менее надежно.

<?php
use Monolog\Logger;
use Monolog\Handler\ElasticsearchHandler;
use Elasticsearch\ClientBuilder;

require 'vendor/autoload.php';

// Создаем клиент Elasticsearch
$client = ClientBuilder::create()
    ->setHosts(['http://elasticsearch:9200'])
    ->build();

// Создаем обработчик для Elasticsearch
$handler = new ElasticsearchHandler(
    $client,
    [
        'index' => 'php-logs',
        'type' => '_doc',
    ],
    Logger::INFO
);

$log = new Logger('direct_logger');
$log->pushHandler($handler);

$log->warning('Прямое сообщение в Elasticsearch', ['service' => 'billing']);

3. Использование Syslog с последующей интеграцией

<?php
use Monolog\Logger;
use Monolog\Handler\SyslogHandler;

$log = new Logger('syslog_app');
$log->pushHandler(new SyslogHandler('php-app', LOG_USER, Logger::DEBUG));

$log->info('Сообщение в системный лог');

Затем на сервере настраивается rsyslog/syslog-ng для пересылки сообщений в Logstash.

Критические рекомендации

  • Используйте структурированное логирование (JSON). Это сильно упрощает парсинг и анализ.
  • Не отправляйте логи напрямую из PHP в Elasticsearch в Production. Это блокирующая операция, которая замедлит ваше приложение. Используйте асинхронные агенты (Filebeat).
  • Настройте rotation лог-файлов (например, с помощью logrotate), чтобы они не переполнили диск.
  • Обогащайте логи контекстом: user_id, request_id, session_id, execution_time — это позволит в Kibana делать мощные агрегации и связанные запросы.
  • Определите mapping в Elasticsearch заранее, особенно для полей с типом date или integer, чтобы избежать проблем с динамическим определением типов.
  • Используйте разные индексы для логов разного уровня (app-info-*, app-error-*) или разных сервисов для лучшего управления и производительности.

Итог

Для отправки логов в Kibana из PHP-приложения оптимальная схема: Monolog с JSON-форматированием -> запись в файл -> сбор Filebeat -> обработка Logstash -> индексация в Elasticsearch -> визуализация в Kibana. Это обеспечивает отказоустойчивость, производительность и гибкость в обработке данных. После настройки пайплайна логи появятся в Kibana в разделе Discover, где вы сможете создавать поисковые запросы, визуализации и дашборды.

Как отправить логи в Kibana? | PrepBro