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 для отдельных сайтов, сообщения будут вида:
Для того, чтобы отфильтровать сообщения для разных виртуальных хостов, нам нужно добавить в лог дополнительную информацию, например, 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 и видим дополнительную информацию в сообщениях:
Теперь можно создать отдельные «streams» в Graylog для каждого виртуального хоста, и назначить отдельные уровни уведомлений для разных хостов.
Таким образом, мы подключили Symfony к Graylog с логированием дополнительной информации, только лишь настройкой конфигурации и без написания дополнительного кода.