繁体   English   中英

异常Eventlistener没有捕获RabbitMQ使用者的异常

[英]Exception Eventlistener is not catching Exceptions from RabbitMQ consumer

我正在Symfony中创建一个微服务,我需要使用RabbitMQ来使用消息来创建文档。 消费者正在工作,但每当抛出异常时,我想以格式和单独的日志文件记录异常。

我正在使用Symfony 4.2,所有抛出的异常都记录在dev.log中。 我在Monolog中创建了一个新频道并在异常中调用,以便我可以管理我的记录。

为此,我使用ExceptionListener并遵循Symfony Docs中的说明。

我的消费者设置如下

public function execute(AMQPMessage $msg): int
    {
        try {
            return $this->documentService->createDocument($this->serializer->deserialize($msg->body, 'array', 'json'));
        } catch (\Exception $e) {
             $this->logger->error($e);

            return ConsumerInterface::MSG_REJECT;
        }
    }

在服务中我有以下内容:

try {
...

    $template = $this->templateRepository->findOneByName($messageData['template']);
    if ($template === null) throw new \Exception('Template does not exist');

...

    return ConsumerInterface::MSG_ACK;
} catch (\Exception $e) {
    $this->logger->error($e);

    return ConsumerInterface::MSG_REJECT;
}

我登录这两个类,但是当一个异常抛出时,我在控制台中得到了异常但是监听器没有捕获ExceptionEvent。

我尝试过不同的事件,并且我将http-kernel软件包添加到Symfony,因为我使用的是Symfony Flex,我没有所有软件包。

我在services.yaml中注册了我的Listener,如下所示:

    App\EventListener\DocumentExceptionListener:
        tags:
            - { name: kernel.event_listener, event: kernel.exception, method: onKernelException }
        arguments:
            $logger: '@monolog.logger.exception' # Log all exceptions to a separate log file

我的ExceptionListener如下:

public function __construct(LoggerInterface $logger, SerializerInterface $serializer)
    {
        $this->logger = $logger;
        $this->serializer = $serializer;

        $this->logger->info('Starting to listen...');
    }

    public function onKernelException(GetResponseForExceptionEvent $event)
    {
        $this->logger->info('currently listening...');

        $this->log($event->getException());
    }

    private function log(\Exception $exception)
    {
        $log = [
            'code' => $exception->getCode(),
            'message' => $exception->getMessage(),
            'called' => [
                'file' => $exception->getTrace()[0]['file'],
                'line' => $exception->getTrace()[0]['line'],
            ],
            'occurred' => [
                'file' => $exception->getFile(),
                'line' => $exception->getLine(),
            ],
        ];

        if ($exception->getPrevious() instanceof Exception) {
            $log += [
                'previous' => [
                    'message' => $exception->getPrevious()->getMessage(),
                    'exception' => get_class($exception->getPrevious()),
                    'file' => $exception->getPrevious()->getFile(),
                    'line' => $exception->getPrevious()->getLine(),
                ],
            ];
        }

        $this->logger->error($this->serializer->serialize($log, 'json'));
    }

我现在的输出是:

exception.INFO: Starting to listen... [] []

我在你的问题中读到了“console”这个词。 如果它是控制台异常(因为它是关于命令执行),则必须以另一种方式标记监听器:

tags:
    - { name: kernel.event_listener, event: console.error }

请在此处查看console.error事件名称。

在此处查看更多信息: 活动和事件监听器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM