猿问

如何在 Symfony 中发生异常或错误时将日志发送到电子邮件?

我的要求:每当应用程序发生错误时,将该错误日志发送到电子邮件。


我正在尝试将我们应用程序中发生的任何异常/错误日志发送到电子邮件。这是我尝试过的方法,但我没有收到电子邮件中的日志。


注意:电子邮件发送功能工作正常,因为我已经在测试控制器中对其进行了测试。但它不适用于此 Listener。


当我点击 TestController Index Route 时会发生什么?


当我访问index路由时,它抛出 500 个内部服务器错误(因为我们故意抛出异常)。但是,如果发生此异常,它应该将日志发送到电子邮件。因为在 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


慕的地8271018
浏览 102回答 2
2回答

蛊毒传说

Edit2:在构造函数中添加电子邮件服务并坚持 onKernelException 的标准定义如果您使用的是 Monolog 和 SwiftMailer,这将在几分钟内完成。我认为一切都得到了很好的解释,但如果您遇到困难,请告诉我们。编辑:我实际上注意到你不使用 Monolog。我会推荐使用它,这样你也有一个包含错误的日志文件。完成后,无论何时触发,$this->logger->error('My error'); 都会发送一封包含错误和堆栈跟踪的电子邮件。这在制作初期非常方便。

明月笑刀无情

首先,您的侦听器的服务定义缺少以下method属性:- { name: kernel.event_listener, event: kernel.exception, method: onKernelException }现在运行以下命令以列出事件的已注册事件侦听器/处理程序kernel.exception。php app/console debug:event-dispatcher kernel.exception如果您的侦听器没有出现,请检查您的服务配置。如果它确实出现但仍未被调用,请检查priority您的侦听器。它的优先级可能低于框架提供的默认侦听器,并且异常可能已由另一个停止事件进一步传播的侦听器处理。如果是这种情况,请提高priority您的侦听器的(优先级更高的优先级)以使其更早调用。services:&nbsp; App\EventListener\ExceptionListener:&nbsp; &nbsp; tags:&nbsp; &nbsp; &nbsp; - { name: kernel.event_listener, event: kernel.exception, method: onKernelException, priority: 1000 }&nbsp;
随时随地看视频慕课网APP
我要回答