Как сконфигурировать 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. Теперь оба сообщения будут записаны в файл логов и отправлены по электронной почте.