为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕的地8271018 2023-04-21 16:27:43
我的要求:每当应用程序发生错误时,将该错误日志发送到电子邮件。我正在尝试将我们应用程序中发生的任何异常/错误日志发送到电子邮件。这是我尝试过的方法,但我没有收到电子邮件中的日志。注意:电子邮件发送功能工作正常,因为我已经在测试控制器中对其进行了测试。但它不适用于此 Listener。当我点击 TestController Index Route 时会发生什么?当我访问index路由时,它抛出 500 个内部服务器错误(因为我们故意抛出异常)。但是,如果发生此异常,它应该将日志发送到电子邮件。因为在 ExceptionListener 中我已经编码了日志的电子邮件发送。但它不发送日志(:异常监听器.php:<?phpnamespace 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 :<?phpnamespace 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 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

Edit2:在构造函数中添加电子邮件服务并坚持 onKernelException 的标准定义

如果您使用的是 Monolog 和 SwiftMailer,这将在几分钟内完成。我认为一切都得到了很好的解释,但如果您遇到困难,请告诉我们。

编辑:我实际上注意到你不使用 Monolog。我会推荐使用它,这样你也有一个包含错误的日志文件。完成后,无论何时触发,$this->logger->error('My error'); 都会发送一封包含错误和堆栈跟踪的电子邮件。这在制作初期非常方便。


查看完整回答
反对 回复 2023-04-21
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

首先,您的侦听器的服务定义缺少以下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 } 



查看完整回答
反对 回复 2023-04-21
  • 2 回答
  • 0 关注
  • 101 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信