-
Notifications
You must be signed in to change notification settings - Fork 145
Expand file tree
/
Copy pathHandler.php
More file actions
124 lines (108 loc) · 3.4 KB
/
Copy pathHandler.php
File metadata and controls
124 lines (108 loc) · 3.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<?php
declare(strict_types=1);
namespace PHPCensor\Logging;
use ErrorException;
use Exception;
use Psr\Log\LoggerInterface;
/**
* @package PHP Censor
* @subpackage Application
*
* @author Dmitry Khomutov <poisoncorpsee@gmail.com>
*/
class Handler
{
protected array $levels = [
E_WARNING => 'Warning',
E_NOTICE => 'Notice',
E_USER_ERROR => 'User Error',
E_USER_WARNING => 'User Warning',
E_USER_NOTICE => 'User Notice',
E_STRICT => 'Runtime Notice',
E_RECOVERABLE_ERROR => 'Catchable Fatal Error',
E_DEPRECATED => 'Deprecated',
E_USER_DEPRECATED => 'User Deprecated',
];
protected ?LoggerInterface $logger;
public function __construct(?LoggerInterface $logger = null)
{
$this->logger = $logger;
}
public static function register(?LoggerInterface $logger = null): void
{
$handler = new static($logger);
\set_error_handler([$handler, 'handleError']);
\register_shutdown_function([$handler, 'handleFatalError']);
\set_exception_handler([$handler, 'handleException']);
}
/**
* @throws ErrorException
*/
public function handleError(int $level, string $message, string $file, int $line): void
{
if (\error_reporting() & $level) {
$exceptionLevel = $this->levels[$level] ?? $level;
throw new ErrorException(
\sprintf('%s: %s in %s line %d', $exceptionLevel, $message, $file, $line),
0,
$level,
$file,
$line
);
}
}
public function handleFatalError(): void
{
$fatalError = \error_get_last();
try {
if (\error_get_last() !== null) {
$error = new ErrorException(
\sprintf(
'%s: %s in %s line %d',
$fatalError['type'],
$fatalError['message'],
$fatalError['file'],
$fatalError['line']
),
0,
$fatalError['type'],
$fatalError['file'],
$fatalError['line']
);
$this->log($error);
}
} catch (\Throwable $e) {
$error = new ErrorException(
\sprintf(
'%s: %s in %s line %d',
$fatalError['type'],
$fatalError['message'],
$fatalError['file'],
$fatalError['line']
),
0,
$fatalError['type'],
$fatalError['file'],
$fatalError['line']
);
$this->log($error);
}
}
public function handleException(\Throwable $exception): void
{
$this->log($exception);
}
protected function log(\Throwable $exception): void
{
if (null !== $this->logger) {
$message = \sprintf(
'%s: %s (uncaught exception) at %s line %s',
\get_class($exception),
$exception->getMessage(),
$exception->getFile(),
$exception->getLine()
);
$this->logger->error($message, ['exception' => $exception]);
}
}
}