Use doctrine to create logs

[MAILPOET-3624]
This commit is contained in:
Pavel Dohnal
2021-06-04 09:29:34 +02:00
committed by Veljko V
parent a3b420d65c
commit e661d07acb
6 changed files with 63 additions and 28 deletions

View File

@@ -219,7 +219,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\Listing\PageLimit::class)->setPublic(true); $container->autowire(\MailPoet\Listing\PageLimit::class)->setPublic(true);
// Logging // Logging
$container->autowire(\MailPoet\Logging\LoggerFactory::class); $container->autowire(\MailPoet\Logging\LoggerFactory::class);
$container->autowire(\MailPoet\Logging\LogRepository::class); $container->autowire(\MailPoet\Logging\LogRepository::class)->setPublic(true);
// Notices // Notices
$container->autowire(\MailPoet\Util\Notices\PermanentNotices::class); $container->autowire(\MailPoet\Util\Notices\PermanentNotices::class);
//Referrals //Referrals

View File

@@ -2,6 +2,7 @@
namespace MailPoet\Entities; namespace MailPoet\Entities;
use DateTimeInterface;
use MailPoet\Doctrine\EntityTraits\AutoincrementedIdTrait; use MailPoet\Doctrine\EntityTraits\AutoincrementedIdTrait;
use MailPoet\Doctrine\EntityTraits\CreatedAtTrait; use MailPoet\Doctrine\EntityTraits\CreatedAtTrait;
use MailPoetVendor\Doctrine\ORM\Mapping as ORM; use MailPoetVendor\Doctrine\ORM\Mapping as ORM;
@@ -52,4 +53,20 @@ class LogEntity {
public function getMessage(): ?string { public function getMessage(): ?string {
return $this->message; 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;
}
} }

View File

@@ -2,6 +2,7 @@
namespace MailPoet\Logging; namespace MailPoet\Logging;
use MailPoet\Entities\LogEntity;
use MailPoet\Models\Log; use MailPoet\Models\Log;
use MailPoetVendor\Carbon\Carbon; use MailPoetVendor\Carbon\Carbon;
use MailPoetVendor\Monolog\Handler\AbstractProcessingHandler; use MailPoetVendor\Monolog\Handler\AbstractProcessingHandler;
@@ -22,30 +23,35 @@ class LogHandler extends AbstractProcessingHandler {
/** @var callable|null */ /** @var callable|null */
private $randFunction; 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); parent::__construct($level, $bubble);
$this->randFunction = $randFunction; $this->randFunction = $randFunction;
$this->logRepository = $logRepository;
} }
protected function write(array $record) { protected function write(array $record) {
$model = $this->createNewLogModel(); $entity = new LogEntity();
$model->hydrate([ $entity->setName($record['channel']);
'name' => $record['channel'], $entity->setLevel($record['level']);
'level' => $record['level'], $entity->setMessage($record['formatted']);
'message' => $record['formatted'], $entity->setCreatedAt($record['datetime']);
'created_at' => $record['datetime']->format('Y-m-d H:i:s'),
]); $this->logRepository->persist($entity);
$model->save(); $this->logRepository->flush();
if ($this->getRandom() <= self::LOG_PURGE_PROBABILITY) { if ($this->getRandom() <= self::LOG_PURGE_PROBABILITY) {
$this->purgeOldLogs(); $this->purgeOldLogs();
} }
} }
private function createNewLogModel() {
return Log::create();
}
private function getRandom() { private function getRandom() {
if ($this->randFunction) { if ($this->randFunction) {
return call_user_func($this->randFunction, 0, 100); return call_user_func($this->randFunction, 0, 100);

View File

@@ -2,6 +2,7 @@
namespace MailPoet\Logging; namespace MailPoet\Logging;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoetVendor\Monolog\Processor\IntrospectionProcessor; use MailPoetVendor\Monolog\Processor\IntrospectionProcessor;
use MailPoetVendor\Monolog\Processor\MemoryUsageProcessor; use MailPoetVendor\Monolog\Processor\MemoryUsageProcessor;
@@ -37,8 +38,12 @@ class LoggerFactory {
/** @var SettingsController */ /** @var SettingsController */
private $settings; private $settings;
public function __construct(SettingsController $settings) { /** @var LogRepository */
private $logRepository;
public function __construct(LogRepository $logRepository, SettingsController $settings) {
$this->settings = $settings; $this->settings = $settings;
$this->logRepository = $logRepository;
} }
/** /**
@@ -60,14 +65,17 @@ class LoggerFactory {
$this->loggerInstances[$name]->pushProcessor(new MemoryUsageProcessor()); $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]; return $this->loggerInstances[$name];
} }
public static function getInstance() { public static function getInstance() {
if (!self::$instance instanceof LoggerFactory) { 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; return self::$instance;
} }

View File

@@ -2,13 +2,21 @@
namespace MailPoet\Logging; namespace MailPoet\Logging;
use MailPoet\Entities\LogEntity;
use MailPoet\Models\Log; use MailPoet\Models\Log;
use MailPoetVendor\Carbon\Carbon; use MailPoetVendor\Carbon\Carbon;
use MailPoetVendor\Idiorm\ORM;
class LogHandlerTest extends \MailPoetTest { 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() { public function testItCreatesLog() {
$logHandler = new LogHandler(); $logHandler = new LogHandler($this->repository);
$time = new \DateTime(); $time = new \DateTime();
$logHandler->handle([ $logHandler->handle([
'level' => \MailPoetVendor\Monolog\Logger::EMERGENCY, 'level' => \MailPoetVendor\Monolog\Logger::EMERGENCY,
@@ -37,7 +45,7 @@ class LogHandlerTest extends \MailPoetTest {
return 0; return 0;
}; };
$logHandler = new LogHandler(\MailPoetVendor\Monolog\Logger::DEBUG, true, $random); $logHandler = new LogHandler($this->repository, \MailPoetVendor\Monolog\Logger::DEBUG, true, $random);
$logHandler->handle([ $logHandler->handle([
'level' => \MailPoetVendor\Monolog\Logger::EMERGENCY, 'level' => \MailPoetVendor\Monolog\Logger::EMERGENCY,
'extra' => [], 'extra' => [],
@@ -52,8 +60,7 @@ class LogHandlerTest extends \MailPoetTest {
public function testItNotPurgesOldLogs() { public function testItNotPurgesOldLogs() {
$model = Log::create(); $model = Log::create();
$date = Carbon::create(); $date = Carbon::now();
assert($date instanceof Carbon);
$model->hydrate([ $model->hydrate([
'name' => 'old name keep', 'name' => 'old name keep',
'level' => '5', 'level' => '5',
@@ -65,7 +72,7 @@ class LogHandlerTest extends \MailPoetTest {
return 100; return 100;
}; };
$logHandler = new LogHandler(\MailPoetVendor\Monolog\Logger::DEBUG, true, $random); $logHandler = new LogHandler($this->repository, \MailPoetVendor\Monolog\Logger::DEBUG, true, $random);
$logHandler->handle([ $logHandler->handle([
'level' => \MailPoetVendor\Monolog\Logger::EMERGENCY, 'level' => \MailPoetVendor\Monolog\Logger::EMERGENCY,
'extra' => [], 'extra' => [],
@@ -77,8 +84,4 @@ class LogHandlerTest extends \MailPoetTest {
$log = Log::whereEqual('name', 'old name keep')->findMany(); $log = Log::whereEqual('name', 'old name keep')->findMany();
expect($log)->notEmpty(); expect($log)->notEmpty();
} }
public function _after() {
ORM::raw_execute('TRUNCATE ' . Log::$_table);
}
} }

View File

@@ -17,7 +17,8 @@ class LoggerFactoryTest extends \MailPoetUnitTest {
public function _before() { public function _before() {
parent::_before(); parent::_before();
$this->settings = $this->createMock(SettingsController::class); $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() { public function testItCreatesLogger() {