Как сконфигурировать Monolog так, чтобы он отправлял ошибки по электронной почте
Как сконфигурировать Monolog так, чтобы он отправлял ошибки по электронной почте
Monolog может быть сконфигурирован так, чтобы отправлять электронное письмо при возникновении ошибки в приложении. Для этого конфигурация требует несколько вложенных обработчиков, чтобы избегать получения слишком большого количества писем. Эта конфигурация на первый взгляд выглядит сложной, но каждый обработчик достаточно простой и ясный, если его разобрать на составляющие.
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
# config/packages/prod/monolog.yaml
monolog:
handlers:
mail:
type: fingers_crossed
# на критическом уровне логируется 500 ошибок
action_level: critical
# чтобы также логировать уровень 400 ошибок (но не ошибок 404):
# action_level: error
# excluded_404s:
# - ^/
handler: deduplicated
deduplicated:
type: deduplication
handler: swift
swift:
type: swift_mailer
from_email: 'error@example.com'
to_email: 'error@example.com'
# или список получателей
# to_email: ['dev1@example.com', 'dev2@example.com', ...]
subject: 'An Error Occurred! %%message%%'
level: debug
formatter: monolog.formatter.html
content_type: text/html
Обработчик mail
- это обработчик fingers_crossed
, что означает, что
он запускается только, когда достигнут уровень действия, в этом случае -
critical
. Уровень critical
запускается только для ошибок HTTP-кода 5xx.
Если этот уровень достигнут единожды, обработчик fingers_crossed
будет
логировать все сообщения, не глядя на их уровень. Настройка handler
означает,
что вывод потом передаётся в обработчик deduplicated
.
Tip
Если вы хотите, чтобы и ошибки 400 и 500 уровня вызывали отправку письма,
установите action_level
в значении error
вместо critical
. См.
код выше, чтобы увидеть пример.
Обработчик deduplicated
просто хранит все сообщения для запроса, а потом
передаёт их во вложенный обработчик за один заход, но только, если записи уникальны
в течение заданного периода времени (по умолчанию - 60 секунд). Если записи являются
дубликатами, то они просто сбрасываются. Добавление этого обработчика уменьшает
объем уведомлений до управляемого уровня, особенно в сценариях критического отказа.
Вы можете настроить временной промежуток, используя опцию time
:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9
# config/packages/prod/monolog.yaml
monolog:
handlers:
# ...
deduplicated:
type: deduplication
# время в секундах, в течение которого удаляются дублированные записи (по умолчанию: 60)
time: 10
handler: swift
Потом сообщения передаются обработчику swift
. Это тот обработчик, который работает
с отправкой вам письма об ошибке. Его установки просты и понятны: адреса отправителя
и получателя, форматировщик, тип содержимого и субъект.
Вы можете комбинировать эти обработчики с другими, чтобы ошибки продолжали логироваться на сервере, а электронные письма продолжали отправляться:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
# config/packages/prod/monolog.yaml
monolog:
handlers:
main:
type: fingers_crossed
action_level: critical
handler: grouped
grouped:
type: group
members: [streamed, deduplicated]
streamed:
type: stream
path: '%kernel.logs_dir%/%kernel.environment%.log'
level: debug
deduplicated:
type: deduplication
handler: swift
swift:
type: swift_mailer
from_email: 'error@example.com'
to_email: 'error@example.com'
subject: 'An Error Occurred! %%message%%'
level: debug
formatter: monolog.formatter.html
content_type: text/html
Используется обработчик group
для отправки сообщений двум членамгруппы, обработчики
deduplicated
и stream
. Теперь оба сообщения будут записаны в файл логов и
отправлены по электронной почте.