Как сконфигурировать Monolog так, чтобы он отправлял ошибки по электронной почте
Дата обновления перевода 2023-09-19
Как сконфигурировать Monolog так, чтобы он отправлял ошибки по электронной почте
3.6
Поддержка отправки ошибок по электронной почте с использованием Symfony mailer была добавлена в MonologBundle 3.6.
Monolog может быть сконфигурирован так, чтобы отправлять электронное письмо при возникновении ошибки в приложении. Для этого конфигурация требует несколько вложенных обработчиков, чтобы избегать получения слишком большого количества писем. Эта конфигурация на первый взгляд выглядит сложной, но каждый обработчик достаточно простой и ясный, если его разобрать на составляющие.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
# config/packages/prod/monolog.yaml
monolog:
handlers:
main:
type: fingers_crossed
# на критическом уровне логируются ошибки 500
action_level: critical
# чтобы также логировать ошибки уровня 400 (но не 404):
# action_level: error
# excluded_http_codes: [404]
handler: deduplicated
deduplicated:
type: deduplication
handler: symfony_mailer
symfony_mailer:
type: symfony_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
Обработчик main
- это обработчик fingers_crossed
, что означает, что
он запускается только, когда достигнут уровень действия, в этом случае -
critical
. Уровень critical
запускается только для ошибок HTTP-кода 5xx.
Если этот уровень достигнут единожды, обработчик fingers_crossed
будет
логировать все сообщения, не глядя на их уровень. Настройка handler
означает,
что вывод потом передаётся в обработчик deduplicated
.
Tip
Если вы хотите, чтобы и ошибки 400 и 500 уровня вызывали отправку письма,
установите action_level
в значении error
вместо critical
. См.
код выше, чтобы увидеть пример.
Обработчик deduplicated
просто хранит все сообщения для запроса, а потом
передаёт их во вложенный обработчик за один заход, но только, если записи уникальны
в течение заданного периода времени (по умолчанию - 60 секунд). Если записи являются
дубликатами, то они просто сбрасываются. Добавление этого обработчика уменьшает
объем уведомлений до управляемого уровня, особенно в сценариях критического отказа.
Вы можете настроить временной промежуток, используя опцию time
:
1 2 3 4 5 6 7 8 9
# config/packages/prod/monolog.yaml
monolog:
handlers:
# ...
deduplicated:
type: deduplication
# время в секундах, в течение которого удаляются дублированные записи (по умолчанию: 60)
time: 10
handler: symfony_mailer
Потом сообщения передаются обработчику symfony_mailer
. Это тот обработчик, который работает
с отправкой вам письма об ошибке. Его установки просты и понятны: адреса отправителя
и получателя, форматировщик, тип содержимого и субъект.
Вы можете комбинировать эти обработчики с другими, чтобы ошибки продолжали логироваться на сервере, а электронные письма продолжали отправляться:
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: symfony_mailer
symfony_mailer:
type: symfony_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
. Теперь оба сообщения будут записаны в файл логов и
отправлены по электронной почте.