logger->critical(self::removePassword($msg), ['app' => 'PHP']); } } /** * Uncaught exception handler */ public function onException(Throwable $exception): void { $class = get_class($exception); $msg = $exception->getMessage(); $msg = "$class: $msg at " . $exception->getFile() . '#' . $exception->getLine(); $this->logger->critical(self::removePassword($msg), ['app' => 'PHP']); } /** * Recoverable errors handler */ public function onError(int $number, string $message, string $file, int $line): bool { if (!(error_reporting() & $number)) { return true; } $msg = $message . ' at ' . $file . '#' . $line; $e = new Error(self::removePassword($msg)); $this->logger->log(self::errnoToLogLevel($number), $e->getMessage(), ['app' => 'PHP']); return true; } /** * Recoverable handler which catch all errors, warnings and notices */ public function onAll(int $number, string $message, string $file, int $line): bool { $msg = $message . ' at ' . $file . '#' . $line; $e = new Error(self::removePassword($msg)); $this->logger->log(self::errnoToLogLevel($number), $e->getMessage(), ['app' => 'PHP']); return true; } private static function errnoToLogLevel(int $errno): int { return match ($errno) { E_USER_WARNING => ILogger::WARN, E_DEPRECATED, E_USER_DEPRECATED => ILogger::DEBUG, E_USER_NOTICE => ILogger::INFO, default => ILogger::ERROR, }; } }