Як сконфігурувати Monolog так, щоб він надсилав помилки електронною поштою

Дата оновлення перекладу 2022-11-04

Як сконфігурувати 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. Тепер обидва повідомлення будуть записані у файл логів і відправлені електронною поштою.