Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Отправка логов в Kibana: архитектура и практическая реализация
Kibana — это не система приема логов, а визуализационный интерфейс и инструмент анализа. Сама отправка данных осуществляется в Elasticsearch, который является ядром стека ELK (Elasticsearch, Logstash, Kibana) или Elastic Stack. Kibana затем подключается к Elasticsearch для отображения и анализа этих данных. Для отправки логов из PHP-приложения используется связка агентов/шипперов (shippers) и, часто, парсер/агрегатор (Logstash).
Ключевые компоненты архитектуры
- Elasticsearch: распределенная поисковая и аналитическая база данных (NoSQL), которая хранит, индексирует и позволяет выполнять поиск по логам.
- Logstash: серверный конвейер для обработки данных. Принимает логи из множества источников, трансформирует их (парсинг, обогащение, фильтрация) и отправляет в Elasticsearch.
- Filebeat (или другие Beats): легковесный агент, устанавливаемый на сервер с приложением. Его задача — собирать логи из файлов и отправлять их дальше (часто в Logstash).
- 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, где вы сможете создавать поисковые запросы, визуализации и дашборды.