123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- <?php
- declare(strict_types=1);
- /**
- * This file is part of Hyperf.
- *
- * @link https://www.hyperf.io
- * @document https://hyperf.wiki
- * @contact group@hyperf.io
- * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
- */
- namespace Hyperf\Framework\Logger;
- use Hyperf\Contract\ConfigInterface;
- use Hyperf\Contract\StdoutLoggerInterface;
- use Psr\Log\LogLevel;
- use Stringable;
- use Symfony\Component\Console\Output\ConsoleOutput;
- use Symfony\Component\Console\Output\OutputInterface;
- use function sprintf;
- use function str_replace;
- /**
- * Default logger for logging server start and requests.
- * PSR-3 logger implementation that logs to STDOUT, using a newline after each
- * message. Priority is ignored.
- */
- class StdoutLogger implements StdoutLoggerInterface
- {
- private OutputInterface $output;
- private array $tags = [
- 'component',
- ];
- public function __construct(private ConfigInterface $config, ?OutputInterface $output = null)
- {
- $this->output = $output ?? new ConsoleOutput();
- }
- public function emergency($message, array $context = []): void
- {
- $this->log(LogLevel::EMERGENCY, $message, $context);
- }
- public function alert($message, array $context = []): void
- {
- $this->log(LogLevel::ALERT, $message, $context);
- }
- public function critical($message, array $context = []): void
- {
- $this->log(LogLevel::CRITICAL, $message, $context);
- }
- public function error($message, array $context = []): void
- {
- $this->log(LogLevel::ERROR, $message, $context);
- }
- public function warning($message, array $context = []): void
- {
- $this->log(LogLevel::WARNING, $message, $context);
- }
- public function notice($message, array $context = []): void
- {
- $this->log(LogLevel::NOTICE, $message, $context);
- }
- public function info($message, array $context = []): void
- {
- $this->log(LogLevel::INFO, $message, $context);
- }
- public function debug($message, array $context = []): void
- {
- $this->log(LogLevel::DEBUG, $message, $context);
- }
- public function log($level, $message, array $context = []): void
- {
- $config = $this->config->get(StdoutLoggerInterface::class, ['log_level' => []]);
- // Check if the log level is allowed
- if (! in_array($level, $config['log_level'], true)) {
- return;
- }
- $tags = array_intersect_key($context, array_flip($this->tags));
- $context = array_diff_key($context, $tags);
- // Handle objects that are not Stringable
- foreach ($context as $key => $value) {
- if (is_object($value) && ! $value instanceof Stringable) {
- $context[$key] = '<OBJECT> ' . $value::class;
- }
- }
- $search = array_map(fn ($key) => sprintf('{%s}', $key), array_keys($context));
- $message = str_replace($search, $context, $this->getMessage((string) $message, $level, $tags));
- $this->output->writeln($message);
- }
- protected function getMessage(string $message, string $level = LogLevel::INFO, array $tags = [])
- {
- $tag = match ($level) {
- LogLevel::EMERGENCY, LogLevel::ALERT, LogLevel::CRITICAL => 'error',
- LogLevel::ERROR => 'fg=red',
- LogLevel::WARNING, LogLevel::NOTICE => 'comment',
- default => 'info',
- };
- $template = sprintf('<%s>[%s]</>', $tag, strtoupper($level));
- $implodedTags = '';
- foreach ($tags as $value) {
- $implodedTags .= (' [' . $value . ']');
- }
- return sprintf($template . $implodedTags . ' %s', $message);
- }
- }
|