Логування через Graylog2 на Symfony2 проектах

Graylog - це нестандартне рішення для ведення логів з можливістю налаштування оповіщень для певних подій, а також перегляду відфільтрованих подій в реальному часі. Він написаний на RoR, швидкий, надійний та має інформативні графіки.

Для зв'язки Symfony2 з Graylog2 bundle нам потрібно https://github.com/mlehner/gelf-php.

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

Додайте до composer.json пакет mlehner / gelf-php:

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

І оновіть вендори:

$ php composer.phar update

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

Налаштування виведення логів на сервері Graylog в Symfony

У конфігурації потрібного оточення (prod, dev, test) пишемо

parameters:
 	graylog.hostname: localhost
 	graylog.port: 12201 #standart port

Для різних середовищ можна налаштувати різні адреси хостів. Наприклад, для розробки і тестування (config_dev) підійде localhost, для Productions (config_prod) - централізований хост для логування.

У базовому конфігураційному файлі "config.yml" оголошуємо два нових сервіси:

У 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" - це обробник монологу, якому передається попередній сервіс як параметр ([@ gelf.publisher]).

Іншими словами, ми створюємо своєрідний сервіс для підписки на монолог подій.

У конфігурації монологу (config.yml) ми повинні вказати його:

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

Ми можемо задати "рівень" повідомлень, починаючи з якого буде приходити лог. Якщо коротко, то ось список повідомлень рівнів у порядку зростання: INHERIT -> DEBUG -> INFO -> WARN -> ERROR -> FATAL. Оскільки у нас рівень "DEBUG", то ми отримуємо всі типи повідомлень, окрім "INHERIT".

Готово! Ви можете перевірити записи журналу на сервері Graylog.

Додавання додаткової інформації до журналу

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

log without processor

Щоб відфільтрувати повідомлення для різних віртуальних хостів, нам потрібно додати в лог додаткову інформацію, наприклад HTTP_HOST. Для додавання додаткової інформації необхідно написати свій сервіс-Процесор для монологу, або скористатися готовим з Monolog / 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

Тепер ви можете створювати окремі "потоки" в Graylog для кожного віртуального хоста і призначати різні рівні сповіщень для різних хостів.

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