This commit is contained in:
Yuri Kuznetsov
2023-02-22 16:56:25 +02:00
parent 4ef66b1601
commit 0a67950913
8 changed files with 83 additions and 147 deletions
@@ -29,38 +29,40 @@
namespace Espo\Core\Log;
use Monolog\{
Logger,
Handler\HandlerInterface,
Handler\FormattableHandlerInterface,
Formatter\FormatterInterface,
};
use Monolog\Formatter\FormatterInterface;
use Monolog\Handler\FormattableHandlerInterface;
use Monolog\Handler\HandlerInterface;
use Monolog\Logger;
use ReflectionClass;
use RuntimeException;
/**
* @phpstan-type DefaultHandlerLoaderData array{
* className?: ?class-string<HandlerInterface>,
* params?: ?array<string, mixed>,
* level?: ?string,
* formatter?: ?FormatterData,
* }
* @phpstan-type FormatterData array{
* className?: ?class-string<FormatterInterface>,
* params?: ?array<string, mixed>,
* }
*/
class DefaultHandlerLoader
{
/**
* @param array{
* className?: ?class-string<HandlerInterface>,
* params?: ?array<string,mixed>,
* level?: ?string,
* } $data
* @param DefaultHandlerLoaderData $data
*/
public function load(array $data, ?string $defaultLevel = null): HandlerInterface
{
/** @var array<mixed,mixed> $data */
$params = $data['params'] ?? [];
$level = $data['level'] ?? $defaultLevel;
if ($level) {
$params['level'] = Logger::toMonologLevel($level);
}
/** @var ?class-string<HandlerInterface> $className */
$className = $data['className'] ?? null;
if (!$className) {
@@ -79,23 +81,16 @@ class DefaultHandlerLoader
}
/**
* @param array{
* formatter?: ?string,
* className?: ?class-string<FormatterInterface>,
* params?: ?array<string,mixed>
* } $data
* @param DefaultHandlerLoaderData $data
*/
protected function loadFormatter(array $data): ?FormatterInterface
{
/** @var array<mixed,mixed> $data */
$formatterData = $data['formatter'] ?? null;
if (!$formatterData || !is_array($formatterData)) {
return null;
}
/** @var ?class-string<FormatterInterface> $className */
$className = $formatterData['className'] ?? null;
if (!$className) {
@@ -110,7 +105,7 @@ class DefaultHandlerLoader
/**
* @template T of object
* @param class-string<T> $className
* @param array<string,mixed> $params
* @param array<string, mixed> $params
* @return T
*/
protected function createInstance(string $className, array $params): object
@@ -29,24 +29,16 @@
namespace Espo\Core\Log;
use Espo\Core\{
Log\Handler\EspoRotatingFileHandler,
Utils\Config,
};
use Espo\Core\Log\Handler\EspoRotatingFileHandler;
use Espo\Core\Utils\Config;
use Monolog\{
Logger,
Handler\HandlerInterface,
};
use Monolog\Handler\HandlerInterface;
use Monolog\Logger;
class EspoRotatingFileHandlerLoader implements HandlerLoader
{
private $config;
public function __construct(Config $config)
{
$this->config = $config;
}
public function __construct(private Config $config)
{}
public function load(array $params): HandlerInterface
{
@@ -29,15 +29,11 @@
namespace Espo\Core\Log\Handler;
use Monolog\{
Logger,
Handler\StreamHandler as MonologStreamHandler,
};
use Monolog\Handler\StreamHandler as MonologStreamHandler;
use Monolog\Logger;
use Espo\Core\{
Utils\File\Manager as FileManager,
Utils\Config,
};
use Espo\Core\Utils\Config;
use Espo\Core\Utils\File\Manager as FileManager;
use RuntimeException;
use Throwable;
@@ -46,13 +42,15 @@ class EspoFileHandler extends MonologStreamHandler
{
protected FileManager $fileManager;
/**
* @var int
*/
/** @var int */
protected $maxErrorMessageLength = 5000;
public function __construct(Config $config, string $filename, int $level = Logger::DEBUG, bool $bubble = true)
{
public function __construct(
Config $config,
string $filename,
int $level = Logger::DEBUG,
bool $bubble = true
) {
parent::__construct($filename, $level, $bubble);
$defaultPermissions = $config->get('defaultPermissions');
@@ -69,9 +67,7 @@ class EspoFileHandler extends MonologStreamHandler
protected function write(array $record): void
{
if (!$this->url) {
throw new RuntimeException(
"Missing a logger file path. Check logger params in config."
);
throw new RuntimeException("Missing a logger file path. Check logger params in config.");
}
try {
@@ -31,30 +31,17 @@ namespace Espo\Core\Log\Handler;
use Monolog\Logger;
use Espo\Core\{
Utils\Config,
};
use Espo\Core\Utils\Config;
class EspoRotatingFileHandler extends EspoFileHandler
{
/**
* @var string
*/
/** @var string */
protected $dateFormat = 'Y-m-d';
/**
* @var string
*/
/** @var string */
protected $filenameFormat = '{filename}-{date}';
/**
* @var string
*/
/** @var string */
protected $filename;
/**
* @var int
*/
/** @var int */
protected $maxFiles;
public function __construct(
@@ -125,8 +112,8 @@ class EspoRotatingFileHandler extends EspoFileHandler
$fileInfo = pathinfo($this->filename);
$glob = str_replace(
array('{filename}', '{date}'),
array($fileInfo['filename'], '.*'),
['{filename}', '{date}'],
[$fileInfo['filename'], '.*'],
$this->filenameFormat
);
@@ -134,8 +121,6 @@ class EspoRotatingFileHandler extends EspoFileHandler
$glob .= '\.'.$fileInfo['extension'];
}
$glob = '^'.$glob.'$';
return $glob;
return '^' . $glob . '$';
}
}
+11 -23
View File
@@ -29,27 +29,20 @@
namespace Espo\Core\Log;
use Monolog\{
Logger,
Handler\HandlerInterface,
};
use Monolog\Handler\HandlerInterface;
use Monolog\Logger;
use Espo\Core\InjectableFactory;
class HandlerListLoader
{
protected InjectableFactory $injectableFactory;
protected DefaultHandlerLoader $defaultLoader;
public function __construct(InjectableFactory $injectableFactory, DefaultHandlerLoader $defaultLoader)
{
$this->injectableFactory = $injectableFactory;
$this->defaultLoader = $defaultLoader;
}
public function __construct(
private InjectableFactory $injectableFactory,
private DefaultHandlerLoader $defaultLoader
) {}
/**
* @param array<array<string,mixed>> $dataList
* @param array<array<string, mixed>> $dataList
* @return HandlerInterface[]
*/
public function load(array $dataList, ?string $defaultLevel = null): array
@@ -70,31 +63,26 @@ class HandlerListLoader
}
/**
* @param array<string,mixed> $data
* @param array<string, mixed> $data
*/
protected function loadHandler(array $data, ?string $defaultLevel = null): ?HandlerInterface
{
$params = $data['params'] ?? [];
$level = $data['level'] ?? $defaultLevel;
if ($level) {
$params['level'] = Logger::toMonologLevel($level);
}
/** @var ?class-string<\Espo\Core\Log\HandlerLoader> $loaderClassName */
/** @var ?class-string<HandlerLoader> $loaderClassName */
$loaderClassName = $data['loaderClassName'] ?? null;
if ($loaderClassName) {
$loader = $this->injectableFactory->create($loaderClassName);
$handler = $loader->load($params);
return $handler;
return $loader->load($params);
}
$handler = $this->defaultLoader->load($data, $defaultLevel);
return $handler;
return $this->defaultLoader->load($data, $defaultLevel);
}
}
+1 -1
View File
@@ -34,7 +34,7 @@ use Monolog\Handler\HandlerInterface;
interface HandlerLoader
{
/**
* @param array<string,mixed> $params
* @param array<string, mixed> $params
*/
public function load(array $params): HandlerInterface;
}
+19 -35
View File
@@ -29,43 +29,30 @@
namespace Espo\Core\Log;
use Espo\Core\{
InjectableFactory,
Utils\Config,
Utils\Log,
Log\HandlerListLoader,
Log\Handler\EspoRotatingFileHandler,
Log\Handler\EspoFileHandler,
};
use Espo\Core\InjectableFactory;
use Espo\Core\Log\Handler\EspoFileHandler;
use Espo\Core\Log\Handler\EspoRotatingFileHandler;
use Espo\Core\Utils\Config;
use Espo\Core\Utils\Log;
use Monolog\{
Logger,
ErrorHandler as MonologErrorHandler,
Formatter\LineFormatter,
Handler\HandlerInterface,
};
use Monolog\ErrorHandler as MonologErrorHandler;
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\HandlerInterface;
use Monolog\Logger;
class LogLoader
{
const LINE_FORMAT = "[%datetime%] %level_name%: %message% %context% %extra%\n";
private const LINE_FORMAT = "[%datetime%] %level_name%: %message% %context% %extra%\n";
private const DATE_FORMAT = 'Y-m-d H:i:s';
private const PATH = 'data/logs/espo.log';
const DATE_FORMAT = 'Y-m-d H:i:s';
private const MAX_FILE_NUMBER = 30;
private const DEFAULT_LEVEL = 'WARNING';
const PATH = 'data/logs/espo.log';
const MAX_FILE_NUMBER = 30;
const DEFAULT_LEVEL = 'WARNING';
protected Config $config;
protected InjectableFactory $injectableFactory;
public function __construct(Config $config, InjectableFactory $injectableFactory)
{
$this->config = $config;
$this->injectableFactory = $injectableFactory;
}
public function __construct(
private Config $config,
private InjectableFactory $injectableFactory
) {}
public function load(): Log
{
@@ -77,13 +64,10 @@ class LogLoader
$level = $this->config->get('logger.level');
$loader = $this->injectableFactory->create(HandlerListLoader::class);
$handlerList = $loader->load($handlerDataList, $level);
}
else {
$handler = $this->createDefaultHandler();
$handlerList = [$handler];
$handlerList = [$this->createDefaultHandler()];
}
foreach ($handlerList as $handler) {
@@ -27,19 +27,15 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace tests\unit\Espo\Core\Console;
namespace tests\unit\Espo\Core\Log;
use Espo\Core\{
InjectableFactory,
Log\HandlerListLoader,
Log\EspoRotatingFileHandlerLoader,
Log\DefaultHandlerLoader,
Log\Handler\EspoRotatingFileHandler,
};
use Espo\Core\InjectableFactory;
use Espo\Core\Log\DefaultHandlerLoader;
use Espo\Core\Log\EspoRotatingFileHandlerLoader;
use Espo\Core\Log\Handler\EspoRotatingFileHandler;
use Espo\Core\Log\HandlerListLoader;
use Monolog\{
Logger,
};
use Monolog\Logger;
class HandlerListLoaderTest extends \PHPUnit\Framework\TestCase
{