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