Ответ
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.