ref
This commit is contained in:
@@ -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 . '$';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user