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);
// 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

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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() {