Files
swiftadmin/vendor/yansongda/supports/src/Logger.php

207 lines
4.4 KiB
PHP
Raw Normal View History

2022-08-19 19:48:37 +08:00
<?php
declare(strict_types=1);
namespace Yansongda\Supports;
use Exception;
use Monolog\Formatter\FormatterInterface;
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\AbstractProcessingHandler;
use Monolog\Handler\RotatingFileHandler;
use Monolog\Handler\StreamHandler;
use Monolog\Logger as BaseLogger;
use Psr\Log\LoggerInterface;
/**
* @method static void emergency($message, array $context = [])
* @method static void alert($message, array $context = [])
* @method static void critical($message, array $context = [])
* @method static void error($message, array $context = [])
* @method static void warning($message, array $context = [])
* @method static void notice($message, array $context = [])
* @method static void info($message, array $context = [])
* @method static void debug($message, array $context = [])
* @method static void log($message, array $context = [])
*/
class Logger
{
/**
* Logger instance.
*
* @var \Psr\Log\LoggerInterface|null
*/
protected $logger;
/**
* formatter.
*
* @var \Monolog\Formatter\FormatterInterface|null
*/
protected $formatter;
/**
* handler.
*
* @var \Monolog\Handler\AbstractProcessingHandler|null
*/
protected $handler;
/**
* config.
*
* @var array
*/
protected $config = [
'file' => null,
'identify' => 'yansongda.supports',
'level' => BaseLogger::DEBUG,
'type' => 'daily',
'max_files' => 30,
];
/**
* Bootstrap.
*/
public function __construct(array $config = [])
{
$this->setConfig($config);
}
/**
* Forward call.
*
* @throws Exception
*/
public function __call(string $method, array $args): void
{
call_user_func_array([$this->getLogger(), $method], $args);
}
/**
* Set logger.
*/
public function setLogger(LoggerInterface $logger): Logger
{
$this->logger = $logger;
return $this;
}
/**
* Return the logger instance.
*
* @throws Exception
*/
public function getLogger(): LoggerInterface
{
if (is_null($this->logger)) {
$this->logger = $this->createLogger();
}
return $this->logger;
}
public function createLogger(): BaseLogger
{
$handler = $this->getHandler();
$handler->setFormatter($this->getFormatter());
$logger = new BaseLogger($this->config['identify']);
$logger->pushHandler($handler);
return $logger;
}
/**
* setFormatter.
*
* @return $this
*/
public function setFormatter(FormatterInterface $formatter): self
{
$this->formatter = $formatter;
return $this;
}
/**
* getFormatter.
*/
public function getFormatter(): FormatterInterface
{
if (is_null($this->formatter)) {
$this->formatter = $this->createFormatter();
}
return $this->formatter;
}
/**
* createFormatter.
*/
public function createFormatter(): LineFormatter
{
return new LineFormatter(
"%datetime% > %channel%.%level_name% > %message% %context% %extra%\n\n",
null,
false,
true
);
}
/**
* setHandler.
*
* @return $this
*/
public function setHandler(AbstractProcessingHandler $handler): self
{
$this->handler = $handler;
return $this;
}
public function getHandler(): AbstractProcessingHandler
{
if (is_null($this->handler)) {
$this->handler = $this->createHandler();
}
return $this->handler;
}
public function createHandler(): AbstractProcessingHandler
{
$file = $this->config['file'] ?? sys_get_temp_dir().'/logs/'.$this->config['identify'].'.log';
if ('single' === $this->config['type']) {
return new StreamHandler($file, $this->config['level']);
}
return new RotatingFileHandler($file, $this->config['max_files'], $this->config['level']);
}
/**
* setConfig.
*
* @return $this
*/
public function setConfig(array $config): self
{
$this->config = array_merge($this->config, $config);
return $this;
}
/**
* getConfig.
*/
public function getConfig(): array
{
return $this->config;
}
}