Подключаем логирование через Graylog2 к проектам на Symfony2

Graylog — нестандартное решение для логирования с возможностью настроить оповещения на определённые события, а так же real-time просмотр отфильтрованных событий. Написан на RoR, быстр, надежен, с информативными графиками.

Настройка конфигурации Graylog2 на Symfony2 осуществляется с помощью библиотеки https://github.com/mlehner/gelf-php.

Установка библиотеки mlehner/gelf-php

Добавить в composer.json пакет mlehner/gelf-php:

"mlehner/gelf-php": "v1.0"

И обновить вендоры:

$ php composer.phar update

Библиотека установлена!

Настройка Graylog2 в Symfony2 для вывода логов на сервер Graylog

В config нужного нам окружения (prod, dev, test) пишем:

parameters:
 	graylog.hostname: localhost
 	graylog.port: 12201 #стандартный порт

Для разных окружений можно настроить разные адреса host-ов. К примеру, для разработки и тестирования (config_dev) может быть localhost, для продакш (config_prod) — централизированый host для логов.

В основном конфиге «config.yml» объявляем 2 новых сервиса:

В config.yml:

services:
 	#...
 	gelf.publisher:
     	class: Gelf\MessagePublisher
     	arguments: [%graylog.hostname%, %graylog.port%]

 	monolog.gelf_handler:
     	class: Monolog\Handler\GelfHandler
     	arguments: [@gelf.publisher]

Первый «gelf.publisher» это непосредственно «отсылатель» сообщений на сервер Graylog, и второй «monolog.gelf_handler» — hendler монолога, которому как параметр ([@gelf.publisher]) передается предыдущий сервис.

Т.е. мы создаем своего рода сервис для подписки на события монолога.

В конфигурации монолога (config.yml) это нужно указать:

monolog:
 	handlers:
     	#...
     	gelf:
         	type: service
         	id: monolog.gelf_handler
         	level: debug

Мы можем задать «level» сообщений, начиная с которого будет приходить лог. Если коротко, вот список уровней сообщений в порядке возрастания: INHERIT -> DEBUG -> INFO -> WARN -> ERROR -> FATAL. Так как у нас стоит уровень «DEBUG», мы будем получать все типы сообщений кроме «INHERIT».

Готово! Можно проверять наличие лог-записей на Graylog сервере.

Добавление дополнительной информации в лог

В силу популярности мощных серверов, а также облачных сервисов, очень часто на одном сервере размещаются несколько виртуальных хостов. В этом случае мы не сможем отфильтровать сообщения в Graylog для отдельных сайтов, сообщения будут вида:

log without processor

Для того, чтобы отфильтровать сообщения для разных виртуальных хостов, нам нужно добавить в лог дополнительную информацию, например, HTTP_HOST. Чтобы добавить дополнительную информацию, нужно написать свой сервис-Processor для monologa, или использовать готовый из Monolog/Processor. Создание своего Processor-ра описано здесь

Мы подключим готовый WebProcessor из Monolog-а. (vendor/Monolog/Processor/WebProcessor)

Объявляем новый сервис в config.yml:

services:
 	#...
monolog.processor.web_processor:
             class: Monolog\Processor\WebProcessor
             tags:
                 - { name: monolog.processor, method: __invoke }

Открываем GrayLog и видим дополнительную информацию в сообщениях:

log with graylog processor

Теперь можно создать отдельные «streams» в Graylog для каждого виртуального хоста, и назначить отдельные уровни уведомлений для разных хостов.

Таким образом, мы подключили Symfony к Graylog с логированием дополнительной информации, только лишь настройкой конфигурации и без написания дополнительного кода.