我正在Symfony中创建一个微服务,在这里我需要使用RabbitMQ来消耗消息来创建文档。使用者正在工作,但是每当抛出异常时,我都希望以一种格式和单独的日志文件记录该异常。
我正在使用Symfony 4.2,并且所有引发的异常都记录在dev.log中。我在Monolog中创建了一个新频道并异常调用,以便可以管理我的日志记录。
通过这种方式,我使用了ExceptionListener,并且遵循了Symfony文档中的说明。
我的消费者设置如下
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。
我尝试了不同的事件,并且我在Symfony中添加了http-kernel软件包,因为我使用的是Symfony Flex,所以我没有所有软件包。
我已经在services.yaml中注册了我的监听器,如下所示:
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... [] []
答案 0 :(得分:0)
我在您的问题中读了“控制台”一词。 如果是控制台异常(因为它与命令执行有关),则必须用另一种方式标记侦听器:
tags:
- { name: kernel.event_listener, event: console.error }
在此处查看console.error
事件名称。
在此处查看更多信息:Events and Event Listeners