Как отправлять журналы на электронную почту об исключении или ошибке в Symfony? - PullRequest
1 голос
/ 30 мая 2020

Мои требования : всякий раз, когда в приложении возникает ошибка, отправляйте эти журналы ошибок на электронную почту.

Я пытаюсь отправить любые журналы исключений / ошибок на электронную почту, которая возникает в нашем приложении. Вот что я пробовал, но я не получаю журналы по электронной почте.

Примечание : функция отправки электронной почты работает нормально, потому что я тестировал ее в тестовом контроллере. Но это не работает с этим слушателем.

Что происходит, когда я нажимаю TestController Index Route?

Когда я просматриваю index маршрут, он выдает внутреннюю ошибку сервера 500 (потому что мы намеренно сгенерировали исключение). Однако, если возникает это исключение, он должен отправить журналы по электронной почте. Потому что в ExceptionListener я закодировал отправку журналов по электронной почте. Но он не отправляет журналы (:

ExceptionListener. php:

<?php

namespace App\EventListener;

use App\Service\EmailService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;

class ExceptionListener
{
    private $em;

    public function __construct(EntityManagerInterface $em)
    {
        $this->em = $em;
    }

    public function onKernelException(EmailService $emailService, ExceptionEvent $event)
    {
        // You get the exception object from the received event
        $exception = $event->getThrowable();
        $message = sprintf(
            'My Error says: %s with code: %s',
            $exception->getMessage(),
            $exception->getCode()
        );

        try {
            $emailService->sendLogToMail("myemail@gmail.com", $message);
        } catch (TransportExceptionInterface $e) {
            //
        }

    }
}

Я зарегистрировал слушателя в services.yaml :

App\EventListener\ExceptionListener:
        tags:
            - { name: kernel.event_listener, event: kernel.exception }

TestController где я намеренно генерирую исключение:

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Exception;

class TestController extends AbstractController
{

    public function index() {

      throw new Exception("It's bad");

    }

}

Я использую Symfony v4.4

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Edit2: Добавьте службу электронной почты в конструктор и придерживайтесь стандартного определения onKernelException

В документации symfony есть очень хорошая статья, чтобы поговорить об этом. документация

Если вы используете Monolog и SwiftMailer, это делается за считанные минуты. Я думаю, что все очень хорошо объяснено, но дайте нам знать, если вы столкнетесь с трудностями.

EDIT: Я действительно заметил, что вы не используете Monolog. Я бы порекомендовал использовать его, чтобы у вас также был файл журнала с ошибкой. После этого, всякий раз, когда вы запускаете $this->logger->error('My error');, будет отправлено электронное письмо с ошибкой и трассировкой стека. Это очень удобно на начальном этапе производства.

1 голос
/ 30 мая 2020

Сначала в определении службы вашего слушателя отсутствует свойство method:

- { name: kernel.event_listener, event: kernel.exception, method: onKernelException }

Теперь выполните следующую команду, чтобы вывести список зарегистрированных прослушивателей / обработчиков событий для события kernel.exception.

php app/console debug:event-dispatcher kernel.exception

Если ваш слушатель не появляется, проверьте конфигурацию вашей службы.

Если показывает , но по-прежнему не вызывается, проверьте priority вашего слушателя. Он может иметь более низкий приоритет, чем прослушиватели по умолчанию, предоставляемые платформой, и исключение может уже обрабатываться другим прослушивателем, который останавливает дальнейшее распространение события.

В этом случае поднимите priority (более высокий приоритет вызывается первым) вашего слушателя, чтобы он был вызван раньше.

services:
  App\EventListener\ExceptionListener:
    tags:
      - { name: kernel.event_listener, event: kernel.exception, method: onKernelException, priority: 1000 } 
...