0, LogLevel::ALERT => 1, LogLevel::CRITICAL => 2, LogLevel::ERROR => 3, LogLevel::WARNING => 4, LogLevel::NOTICE => 5, LogLevel::INFO => 6, LogLevel::DEBUG => 7, ]; public function __construct(private readonly string $level = LogLevel::DEBUG) { if (isset($_SERVER['RR_RPC'])) { $rpc = RPC::create('tcp://127.0.0.1:6001'); $this->rpcLogger = new RRLogger($rpc); } $this->monologLogger = new \Monolog\Logger('app_logger'); $formatter = new JsonFormatter(); $this->monologLogger->pushHandler(new StreamHandler('php://stdout')->setFormatter($formatter)); } public function emergency(\Stringable|string $message, array $context = []): void { $this->log(LogLevel::EMERGENCY, $message, $context); } public function alert(\Stringable|string $message, array $context = []): void { $this->log(LogLevel::ALERT, $message, $context); } public function critical(\Stringable|string $message, array $context = []): void { $this->log(LogLevel::CRITICAL, $message, $context); } public function error(\Stringable|string $message, array $context = []): void { $this->log(LogLevel::ERROR, $message, $context); } public function warning(\Stringable|string $message, array $context = []): void { $this->log(LogLevel::WARNING, $message, $context); } public function notice(\Stringable|string $message, array $context = []): void { $this->log(LogLevel::NOTICE, $message, $context); } public function info(\Stringable|string $message, array $context = []): void { $this->log(LogLevel::INFO, $message, $context); } public function debug(\Stringable|string $message, array $context = []): void { $this->log(LogLevel::DEBUG, $message, $context); } public function log($level, \Stringable|string $message, array $context = []): void { if ($this->levels[$level] > $this->levels[$this->level]) { return; } if ($this->rpcLogger) { switch ($level) { case LogLevel::DEBUG: $this->rpcLogger->debug((string)$message, $context); break; case LogLevel::NOTICE: case LogLevel::INFO: $this->rpcLogger->info((string)$message, $context); break; case LogLevel::WARNING: $this->rpcLogger->warning((string)$message, $context); break; case LogLevel::CRITICAL: case LogLevel::ERROR: case LogLevel::ALERT: case LogLevel::EMERGENCY: $this->rpcLogger->error((string)$message, $context); break; default: $this->rpcLogger->log((string)$message, $context); break; } return; } $this->monologLogger->log($this->levels[$level], (string)$message, $context); } }