Query Count Logger for Doctrine
This Doctrine SQL Logger allows you to get the number of queries to the database at any time.
composer require demyan112rv/doctrine-query-count-logger
namespace App\DependencyInjection\Compiler;
use Demyan112rv\DoctrineQueryCountLogger\QueryCountLogger;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class DoctrineLoggerCompilerPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container): void
{
$isProd = $container->getParameter('kernel.environment') === 'prod';
$logger = $container->findDefinition(QueryCountLogger::class);
if ($isProd) {
$definition = $container->findDefinition('doctrine.dbal.connection.configuration');
$definition->addMethodCall('setSQLLogger', [$logger]);
} else {
$definition = $container->findDefinition('doctrine.dbal.logger.chain');
$definition->addMethodCall('addLogger', [$logger]);
}
}
}
namespace App;
use App\DependencyInjection\Compiler\DoctrineLoggerCompilerPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Kernel as BaseKernel;
class Kernel extends BaseKernel
{
...
protected function buildContainer(): ContainerBuilder
{
$containerBuilder = parent::buildContainer();
$containerBuilder->addCompilerPass(new DoctrineLoggerCompilerPass());
return $containerBuilder;
}
}
namespace App\EventListener;
use Demyan112rv\DoctrineQueryCountLogger\QueryCountLogger;
use Psr\Log\LoggerAwareTrait;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\TerminateEvent;
class DoctrineQueryListener
{
use LoggerAwareTrait;
private const MAX_DOCTRINE_QUERY_COUNT = 100;
/**
* @var QueryCountLogger
*/
private $queryCountLogger;
public function __construct(
QueryCountLogger $queryCountLogger,
LoggerInterface $logger
) {
$this->queryCountLogger = $queryCountLogger;
$this->logger = $logger;
}
public function onKernelTerminate(TerminateEvent $event): void
{
if ($this->queryCountLogger->getCount() > self::MAX_DOCTRINE_QUERY_COUNT) {
$this->logger->alert('Doctrine: a lot of queries to the database', [
'controller' => $event->getRequest();->get('_controller'),
'route' => $event->getRequest();->get('_route'),
'count' => $this->queryCountLogger->getCount(),
]);
}
}
}
services:
App\EventListener\DoctrineQueryListener:
tags:
- { name: kernel.event_listener, event: kernel.terminate, priority: -2}