Как настроить отправку логов из PHP-приложения в Kibana?

«Как настроить отправку логов из PHP-приложения в Kibana?» — вопрос из категории DevOps, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Kibana — это визуализатор для Elasticsearch. Чтобы отправлять логи из PHP, нужно сначала доставить их в Elasticsearch. Я обычно настраиваю это через связку Monolog (PHP) -> Filebeat (агент) -> Elasticsearch -> Kibana.

1. Настройка Monolog в приложении: Конфигурируем канал, который пишет логи в формате JSON в отдельный файл.

// Используем библиотеку monolog/monolog
use MonologLogger;
use MonologHandlerStreamHandler;
use MonologFormatterJsonFormatter;

// Создаем логгер
$log = new Logger('app');

// Создаем обработчик для файла
$stream = new StreamHandler('/var/log/myapp/app.log', Logger::DEBUG);

// Устанавливаем JSON-форматтер для удобства парсинга
$formatter = new JsonFormatter();
$stream->setFormatter($formatter);

$log->pushHandler($stream);

// Использование
$log->error('Ошибка при обработке платежа', [
    'transaction_id' => 12345,
    'user_id' => 67890,
    'error_code' => 'INSUFFICIENT_FUNDS'
]);

2. Настройка Filebeat (filebeat.yml): Filebeat будет следить за этим файлом и отправлять новые записи в Elasticsearch.

filebeat.inputs:
- type: filestream
  enabled: true
  paths:
    - /var/log/myapp/*.log
  json.keys_under_root: true # Парсим JSON-поля
  json.add_error_key: true

output.elasticsearch:
  hosts: ["elasticsearch-host:9200"]
  indices:
    - index: "php-app-logs-%{+yyyy.MM.dd}"

setup.template.name: "php-logs"
setup.template.pattern: "php-app-logs-*"

3. Результат в Kibana: После запуска Filebeat и настройки index pattern в Kibana (например, php-app-logs-*), все структурированные поля (transaction_id, user_id, error_code) станут доступны для поиска, фильтрации и построения дашбордов.

Альтернатива для высоконагруженных систем: Можно отправлять логи напрямую в Logstash по TCP/UDP или HTTP, что дает больше возможностей для обработки и буферизации перед Elasticsearch.