Use doctrine to create logs
[MAILPOET-3624]
This commit is contained in:
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -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() {
|
||||||
|
Reference in New Issue
Block a user