فهرست منبع

Add Cote\Log to Core\ErrorHandler

Visman 4 سال پیش
والد
کامیت
130b10264e
2فایلهای تغییر یافته به همراه62 افزوده شده و 18 حذف شده
  1. 60 18
      app/Core/ErrorHandler.php
  2. 2 0
      app/bootstrap.php

+ 60 - 18
app/Core/ErrorHandler.php

@@ -10,10 +10,18 @@ declare(strict_types=1);
 
 namespace ForkBB\Core;
 
+use ForkBB\Core\Container;
+use Psr\Log\NullLogger;
 use Throwable;
 
 class ErrorHandler
 {
+    /**
+     * Контейнер
+     * @var Container
+     */
+    protected $c;
+
     /**
      * Уровень буфера вывода на котором работает обработчик
      * @var int
@@ -37,22 +45,22 @@ class ErrorHandler
      * @var array
      */
     protected $type = [
-        0                    => 'OTHER_ERROR',
-        \E_ERROR             => 'E_ERROR',
-        \E_WARNING           => 'E_WARNING',
-        \E_PARSE             => 'E_PARSE',
-        \E_NOTICE            => 'E_NOTICE',
-        \E_CORE_ERROR        => 'E_CORE_ERROR',
-        \E_CORE_WARNING      => 'E_CORE_WARNING',
-        \E_COMPILE_ERROR     => 'E_COMPILE_ERROR',
-        \E_COMPILE_WARNING   => 'E_COMPILE_WARNING',
-        \E_USER_ERROR        => 'E_USER_ERROR',
-        \E_USER_WARNING      => 'E_USER_WARNING',
-        \E_USER_NOTICE       => 'E_USER_NOTICE',
-        \E_STRICT            => 'E_STRICT',
-        \E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',
-        \E_DEPRECATED        => 'E_DEPRECATED',
-        \E_USER_DEPRECATED   => 'E_USER_DEPRECATED',
+        0                    => ['OTHER_ERROR',         'error'],
+        \E_ERROR             => ['E_ERROR',             'error'],
+        \E_WARNING           => ['E_WARNING',           'warning'],
+        \E_PARSE             => ['E_PARSE',             'critical'],
+        \E_NOTICE            => ['E_NOTICE',            'notice'],
+        \E_CORE_ERROR        => ['E_CORE_ERROR',        'error'],
+        \E_CORE_WARNING      => ['E_CORE_WARNING',      'warning'],
+        \E_COMPILE_ERROR     => ['E_COMPILE_ERROR',     'error'],
+        \E_COMPILE_WARNING   => ['E_COMPILE_WARNING',   'warning'],
+        \E_USER_ERROR        => ['E_USER_ERROR',        'error'],
+        \E_USER_WARNING      => ['E_USER_WARNING',      'warning'],
+        \E_USER_NOTICE       => ['E_USER_NOTICE',       'notice'],
+        \E_STRICT            => ['E_STRICT',            'error'],
+        \E_RECOVERABLE_ERROR => ['E_RECOVERABLE_ERROR', 'error'],
+        \E_DEPRECATED        => ['E_DEPRECATED',        'warning'],
+        \E_USER_DEPRECATED   => ['E_USER_DEPRECATED',   'warning'],
     ];
 
     public function __construct()
@@ -75,6 +83,11 @@ class ErrorHandler
         //????
     }
 
+    public function setContainer(Container $c): void
+    {
+        $this->c = $c;
+    }
+
     /**
      * Обрабатыет перехватываемые ошибки
      */
@@ -152,7 +165,36 @@ class ErrorHandler
      */
     protected function log(array $error): void
     {
-        \error_log($this->message($error, true));
+        $useErrLog = true;
+
+        try {
+            if (! $this->c->Log instanceof NullLogger) {
+                $context = [];
+                $method  = $this->type[$error['type']][1] ?? $this->type[0][1];
+
+                if (isset($error['exception'])) {
+                    $context['exception'] = $error['exception'];
+                }
+                $context['headers'] = false;
+
+                $this->c->Log->{$method}($this->message($error), $context);
+
+                $useErrLog = false;
+            }
+        } catch (Throwable $e) {
+            \error_log($this->message([
+                'type'      => 0,
+                'message'   => $e->getMessage(),
+                'file'      => $e->getFile(),
+                'line'      => $e->getLine(),
+                'trace'     => $e->getTrace(),
+                'exception' => $e,
+            ], true));
+        }
+
+        if ($useErrLog) {
+            \error_log($this->message($error, true));
+        }
     }
 
     /**
@@ -256,7 +298,7 @@ EOT;
      */
     protected function message(array $error, bool $useException = false): string
     {
-        $type = $this->type[$error['type']] ?? $this->type[0];
+        $type = $this->type[$error['type']][0] ?? $this->type[0][0];
 
         if (
             $useException

+ 2 - 0
app/bootstrap.php

@@ -36,6 +36,8 @@ if (\is_file(__DIR__ . '/config/main.php')) {
     throw new RuntimeException('Application is not configured');
 }
 
+$errorHandler->setContainer($c);
+
 require __DIR__ . '/functions.php';
 \ForkBB\_init($c);