diff --git a/lib/DI/ContainerConfigurator.php b/lib/DI/ContainerConfigurator.php index 1e5b1ad20d..6b50c15d1d 100644 --- a/lib/DI/ContainerConfigurator.php +++ b/lib/DI/ContainerConfigurator.php @@ -219,7 +219,7 @@ class ContainerConfigurator implements IContainerConfigurator { $container->autowire(\MailPoet\Listing\PageLimit::class)->setPublic(true); // Logging $container->autowire(\MailPoet\Logging\LoggerFactory::class); - $container->autowire(\MailPoet\Logging\LogRepository::class); + $container->autowire(\MailPoet\Logging\LogRepository::class)->setPublic(true); // Notices $container->autowire(\MailPoet\Util\Notices\PermanentNotices::class); //Referrals diff --git a/lib/Entities/LogEntity.php b/lib/Entities/LogEntity.php index 0ef71addec..bff433d554 100644 --- a/lib/Entities/LogEntity.php +++ b/lib/Entities/LogEntity.php @@ -2,6 +2,7 @@ namespace MailPoet\Entities; +use DateTimeInterface; use MailPoet\Doctrine\EntityTraits\AutoincrementedIdTrait; use MailPoet\Doctrine\EntityTraits\CreatedAtTrait; use MailPoetVendor\Doctrine\ORM\Mapping as ORM; @@ -52,4 +53,20 @@ class LogEntity { public function getMessage(): ?string { return $this->message; } + + public function setName(?string $name): void { + $this->name = $name; + } + + public function setLevel(?int $level): void { + $this->level = $level; + } + + public function setMessage(?string $message): void { + $this->message = $message; + } + + public function setCreatedAt(DateTimeInterface $createdAt): void { + $this->createdAt = $createdAt; + } } diff --git a/lib/Logging/LogHandler.php b/lib/Logging/LogHandler.php index 29bb148a56..76716925e7 100644 --- a/lib/Logging/LogHandler.php +++ b/lib/Logging/LogHandler.php @@ -2,6 +2,7 @@ namespace MailPoet\Logging; +use MailPoet\Entities\LogEntity; use MailPoet\Models\Log; use MailPoetVendor\Carbon\Carbon; use MailPoetVendor\Monolog\Handler\AbstractProcessingHandler; @@ -22,30 +23,35 @@ class LogHandler extends AbstractProcessingHandler { /** @var callable|null */ private $randFunction; - public function __construct($level = \MailPoetVendor\Monolog\Logger::DEBUG, $bubble = \true, $randFunction = null) { + /** @var LogRepository */ + private $logRepository; + + public function __construct( + LogRepository $logRepository, + $level = \MailPoetVendor\Monolog\Logger::DEBUG, + $bubble = \true, + $randFunction = null + ) { parent::__construct($level, $bubble); $this->randFunction = $randFunction; + $this->logRepository = $logRepository; } protected function write(array $record) { - $model = $this->createNewLogModel(); - $model->hydrate([ - 'name' => $record['channel'], - 'level' => $record['level'], - 'message' => $record['formatted'], - 'created_at' => $record['datetime']->format('Y-m-d H:i:s'), - ]); - $model->save(); + $entity = new LogEntity(); + $entity->setName($record['channel']); + $entity->setLevel($record['level']); + $entity->setMessage($record['formatted']); + $entity->setCreatedAt($record['datetime']); + + $this->logRepository->persist($entity); + $this->logRepository->flush(); if ($this->getRandom() <= self::LOG_PURGE_PROBABILITY) { $this->purgeOldLogs(); } } - private function createNewLogModel() { - return Log::create(); - } - private function getRandom() { if ($this->randFunction) { return call_user_func($this->randFunction, 0, 100); diff --git a/lib/Logging/LoggerFactory.php b/lib/Logging/LoggerFactory.php index 75b981ce1e..02e1f6fa58 100644 --- a/lib/Logging/LoggerFactory.php +++ b/lib/Logging/LoggerFactory.php @@ -2,6 +2,7 @@ namespace MailPoet\Logging; +use MailPoet\DI\ContainerWrapper; use MailPoet\Settings\SettingsController; use MailPoetVendor\Monolog\Processor\IntrospectionProcessor; use MailPoetVendor\Monolog\Processor\MemoryUsageProcessor; @@ -37,8 +38,12 @@ class LoggerFactory { /** @var SettingsController */ private $settings; - public function __construct(SettingsController $settings) { + /** @var LogRepository */ + private $logRepository; + + public function __construct(LogRepository $logRepository, SettingsController $settings) { $this->settings = $settings; + $this->logRepository = $logRepository; } /** @@ -60,14 +65,17 @@ class LoggerFactory { $this->loggerInstances[$name]->pushProcessor(new MemoryUsageProcessor()); } - $this->loggerInstances[$name]->pushHandler(new LogHandler($this->getDefaultLogLevel())); + $this->loggerInstances[$name]->pushHandler(new LogHandler($this->logRepository, $this->getDefaultLogLevel())); } return $this->loggerInstances[$name]; } public static function getInstance() { if (!self::$instance instanceof LoggerFactory) { - self::$instance = new LoggerFactory(SettingsController::getInstance()); + self::$instance = new LoggerFactory( + ContainerWrapper::getInstance()->get(LogRepository::class), + SettingsController::getInstance() + ); } return self::$instance; } diff --git a/tests/integration/Logging/LogHandlerTest.php b/tests/integration/Logging/LogHandlerTest.php index efc8f360d7..6c7e1916fe 100644 --- a/tests/integration/Logging/LogHandlerTest.php +++ b/tests/integration/Logging/LogHandlerTest.php @@ -2,13 +2,21 @@ namespace MailPoet\Logging; +use MailPoet\Entities\LogEntity; use MailPoet\Models\Log; use MailPoetVendor\Carbon\Carbon; -use MailPoetVendor\Idiorm\ORM; class LogHandlerTest extends \MailPoetTest { + /** @var LogRepository */ + private $repository; + + public function _before() { + $this->truncateEntity(LogEntity::class); + $this->repository = $this->diContainer->get(LogRepository::class); + } + public function testItCreatesLog() { - $logHandler = new LogHandler(); + $logHandler = new LogHandler($this->repository); $time = new \DateTime(); $logHandler->handle([ 'level' => \MailPoetVendor\Monolog\Logger::EMERGENCY, @@ -37,7 +45,7 @@ class LogHandlerTest extends \MailPoetTest { return 0; }; - $logHandler = new LogHandler(\MailPoetVendor\Monolog\Logger::DEBUG, true, $random); + $logHandler = new LogHandler($this->repository, \MailPoetVendor\Monolog\Logger::DEBUG, true, $random); $logHandler->handle([ 'level' => \MailPoetVendor\Monolog\Logger::EMERGENCY, 'extra' => [], @@ -52,8 +60,7 @@ class LogHandlerTest extends \MailPoetTest { public function testItNotPurgesOldLogs() { $model = Log::create(); - $date = Carbon::create(); - assert($date instanceof Carbon); + $date = Carbon::now(); $model->hydrate([ 'name' => 'old name keep', 'level' => '5', @@ -65,7 +72,7 @@ class LogHandlerTest extends \MailPoetTest { return 100; }; - $logHandler = new LogHandler(\MailPoetVendor\Monolog\Logger::DEBUG, true, $random); + $logHandler = new LogHandler($this->repository, \MailPoetVendor\Monolog\Logger::DEBUG, true, $random); $logHandler->handle([ 'level' => \MailPoetVendor\Monolog\Logger::EMERGENCY, 'extra' => [], @@ -77,8 +84,4 @@ class LogHandlerTest extends \MailPoetTest { $log = Log::whereEqual('name', 'old name keep')->findMany(); expect($log)->notEmpty(); } - - public function _after() { - ORM::raw_execute('TRUNCATE ' . Log::$_table); - } } diff --git a/tests/unit/Logging/LoggerFactoryTest.php b/tests/unit/Logging/LoggerFactoryTest.php index ffe76a2da8..5175b787f0 100644 --- a/tests/unit/Logging/LoggerFactoryTest.php +++ b/tests/unit/Logging/LoggerFactoryTest.php @@ -17,7 +17,8 @@ class LoggerFactoryTest extends \MailPoetUnitTest { public function _before() { parent::_before(); $this->settings = $this->createMock(SettingsController::class); - $this->loggerFactory = new LoggerFactory($this->settings); + $repository = $this->createMock(LogRepository::class); + $this->loggerFactory = new LoggerFactory($repository, $this->settings); } public function testItCreatesLogger() {