vendor/dachcom-digital/dynamic-search-data-provider-crawler/src/DsWebCrawlerBundle/EventSubscriber/LogEventSubscriber.php line 138

Open in your IDE?
  1. <?php
  2. namespace DsWebCrawlerBundle\EventSubscriber;
  3. use DsWebCrawlerBundle\DsWebCrawlerBundle;
  4. use DsWebCrawlerBundle\DsWebCrawlerEvents;
  5. use DynamicSearchBundle\Context\ContextDefinitionInterface;
  6. use DynamicSearchBundle\Logger\LoggerInterface;
  7. use DynamicSearchBundle\Normalizer\Resource\ResourceMetaInterface;
  8. use Symfony\Contracts\EventDispatcher\Event;
  9. use Symfony\Component\EventDispatcher\GenericEvent;
  10. use VDB\Spider\Event\SpiderEvents;
  11. class LogEventSubscriber implements EventSubscriberInterface
  12. {
  13.     protected string|float $startedTime;
  14.     protected int $persisted 0;
  15.     protected int $queued 0;
  16.     protected int $filtered 0;
  17.     protected int $failed 0;
  18.     protected string $contextName;
  19.     protected string $contextDispatchType;
  20.     protected string $crawlType;
  21.     protected ?ResourceMetaInterface $resourceMeta null;
  22.     protected LoggerInterface $logger;
  23.     public function setContextName(string $contextName): void
  24.     {
  25.         $this->contextName $contextName;
  26.     }
  27.     public function setContextDispatchType(string $contextDispatchType): void
  28.     {
  29.         $this->contextDispatchType $contextDispatchType;
  30.     }
  31.     public function setCrawlType(string $crawlType): void
  32.     {
  33.         $this->crawlType $crawlType;
  34.     }
  35.     public function setResourceMeta(?ResourceMetaInterface $resourceMeta): void
  36.     {
  37.         $this->resourceMeta $resourceMeta;
  38.     }
  39.     public function setLogger(LoggerInterface $logger): void
  40.     {
  41.         $this->logger $logger;
  42.     }
  43.     public static function getSubscribedEvents(): array
  44.     {
  45.         return [
  46.             SpiderEvents::SPIDER_CRAWL_FILTER_POSTFETCH   => 'logFiltered',
  47.             SpiderEvents::SPIDER_CRAWL_FILTER_PREFETCH    => 'logFiltered',
  48.             SpiderEvents::SPIDER_CRAWL_POST_ENQUEUE       => 'logQueued',
  49.             SpiderEvents::SPIDER_CRAWL_RESOURCE_PERSISTED => 'logPersisted',
  50.             SpiderEvents::SPIDER_CRAWL_ERROR_REQUEST      => 'logFailed',
  51.             SpiderEvents::SPIDER_CRAWL_POST_REQUEST       => 'logCrawled',
  52.             SpiderEvents::SPIDER_CRAWL_USER_STOPPED       => 'logStoppedBySignal',
  53.             DsWebCrawlerEvents::DS_WEB_CRAWLER_START      => 'logStarted',
  54.             DsWebCrawlerEvents::DS_WEB_CRAWLER_FINISH     => 'logFinished'
  55.         ];
  56.     }
  57.     public function logStarted(GenericEvent $event): void
  58.     {
  59.         $this->queued 0;
  60.         $this->filtered 0;
  61.         $this->failed 0;
  62.         $this->persisted 0;
  63.         $this->startedTime microtime(true);
  64.     }
  65.     public function logFinished(GenericEvent $event): void
  66.     {
  67.         $totalTime microtime(true) - $this->startedTime;
  68.         $totalTime number_format((float) $totalTime3'.''');
  69.         $minutes str_pad(floor($totalTime 60), 2'0'STR_PAD_LEFT);
  70.         $seconds str_pad($totalTime 602'0'STR_PAD_LEFT);
  71.         $peakMem round(memory_get_peak_usage(true) / 1024 10242);
  72.         if ($this->queued 0) {
  73.             $this->logEvent('finished'$event'debug''enqueued links: ' $this->queued);
  74.         }
  75.         if ($this->filtered 0) {
  76.             $this->logEvent('finished'$event'debug''skipped links: ' $this->filtered);
  77.         }
  78.         if ($this->failed 0) {
  79.             $this->logEvent('finished'$event'debug''failed links: ' $this->failed);
  80.         }
  81.         if ($this->persisted 0) {
  82.             $this->logEvent('finished'$event'debug''persisted links: ' $this->persisted);
  83.         }
  84.         if ($this->contextDispatchType === ContextDefinitionInterface::CONTEXT_DISPATCH_TYPE_INDEX) {
  85.             $this->logEvent('finished'$event'debug''memory peak usage: ' $peakMem 'MB');
  86.             $this->logEvent('finished'$event'debug''total time: ' $minutes ':' $seconds);
  87.         }
  88.     }
  89.     public function logQueued(GenericEvent $event): void
  90.     {
  91.         $this->queued++;
  92.         $this->logEvent('queued'$event);
  93.     }
  94.     public function logPersisted(GenericEvent $event): void
  95.     {
  96.         $this->persisted++;
  97.         $this->logEvent('persisted'$event);
  98.     }
  99.     /**
  100.      * @param GenericEvent $event
  101.      */
  102.     public function logFiltered(GenericEvent $event): void
  103.     {
  104.         $this->queued++;
  105.         $filterType $event->hasArgument('filterType') ? $event->getArgument('filterType') . '.' '';
  106.         $name $filterType 'filtered';
  107.         $this->logEvent($name$event);
  108.     }
  109.     public function logFailed(GenericEvent $event): void
  110.     {
  111.         $this->failed++;
  112.         $message preg_replace('/\s+/S'' '$event->getArgument('message'));
  113.         $this->logEvent('failed'$event'critical'$message);
  114.     }
  115.     public function logStoppedBySignal(Event $event): void
  116.     {
  117.         $logEvent = new GenericEvent($this, ['errorMessage' => 'crawling canceled']);
  118.         $this->logEvent('stopped'$logEvent'debug'$logEvent->getArgument('errorMessage'));
  119.     }
  120.     public function logCrawled(GenericEvent $event): void
  121.     {
  122.         $this->logEvent('uri.crawled'$event'debug');
  123.     }
  124.     protected function logEvent(string $nameGenericEvent $eventstring $debugLevel 'debug'string $additionalMessage ''): void
  125.     {
  126.         $triggerLog in_array($name, [
  127.             'uri.crawled',
  128.             'uri.match.invalid.filtered',
  129.             'uri.match.forbidden.filtered',
  130.             'filtered',
  131.             'failed',
  132.             'stopped',
  133.             'started',
  134.             'finished',
  135.         ]);
  136.         if ($triggerLog) {
  137.             $prefix '[spider.' $name '] ';
  138.             $message $prefix;
  139.             if (!empty($additionalMessage)) {
  140.                 $message .= $additionalMessage ' ';
  141.             }
  142.             $message .= $event->hasArgument('uri') ? $event->getArgument('uri')->toString() : '';
  143.             $this->logger->log($debugLevel$messageDsWebCrawlerBundle::PROVIDER_NAME$this->contextName);
  144.         }
  145.     }
  146. }