38 private static $fatalErrors = array(E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR);
42 $this->logger = $logger;
56 public static function register(
LoggerInterface $logger, $errorLevelMap = array(), $exceptionLevel = null, $fatalLevel = null)
58 $handler =
new static($logger);
59 if ($errorLevelMap !==
false) {
60 $handler->registerErrorHandler($errorLevelMap);
62 if ($exceptionLevel !==
false) {
63 $handler->registerExceptionHandler($exceptionLevel);
65 if ($fatalLevel !==
false) {
66 $handler->registerFatalHandler($fatalLevel);
74 $prev = set_exception_handler(array($this,
'handleException'));
75 $this->uncaughtExceptionLevel = $level;
76 if ($callPrevious && $prev) {
77 $this->previousExceptionHandler = $prev;
83 $prev = set_error_handler(array($this,
'handleError'), $errorTypes);
84 $this->errorLevelMap = array_replace($this->defaultErrorLevelMap(), $levelMap);
86 $this->previousErrorHandler = $prev ?:
true;
92 register_shutdown_function(array($this,
'handleFatalError'));
94 $this->reservedMemory = str_repeat(
' ', 1024 * $reservedMemorySize);
95 $this->fatalLevel = $level;
101 E_ERROR => LogLevel::CRITICAL,
102 E_WARNING => LogLevel::WARNING,
103 E_PARSE => LogLevel::ALERT,
104 E_NOTICE => LogLevel::NOTICE,
105 E_CORE_ERROR => LogLevel::CRITICAL,
106 E_CORE_WARNING => LogLevel::WARNING,
107 E_COMPILE_ERROR => LogLevel::ALERT,
108 E_COMPILE_WARNING => LogLevel::WARNING,
109 E_USER_ERROR => LogLevel::ERROR,
110 E_USER_WARNING => LogLevel::WARNING,
111 E_USER_NOTICE => LogLevel::NOTICE,
112 E_STRICT => LogLevel::NOTICE,
113 E_RECOVERABLE_ERROR => LogLevel::ERROR,
114 E_DEPRECATED => LogLevel::NOTICE,
115 E_USER_DEPRECATED => LogLevel::NOTICE,
125 $this->uncaughtExceptionLevel === null ? LogLevel::ERROR : $this->uncaughtExceptionLevel,
126 sprintf(
'Uncaught Exception %s: "%s" at %s line %s', get_class($e), $e->getMessage(), $e->getFile(), $e->getLine()),
127 array(
'exception' => $e)
130 if ($this->previousExceptionHandler) {
131 call_user_func($this->previousExceptionHandler, $e);
142 if (!(error_reporting() &
$code)) {
146 $level = isset($this->errorLevelMap[
$code]) ? $this->errorLevelMap[
$code] : LogLevel::CRITICAL;
147 $this->logger->log($level, self::codeToString($code).
': '.$message, array(
'code' => $code,
'message' => $message,
'file' =>
$file,
'line' => $line));
149 if ($this->previousErrorHandler ===
true) {
151 } elseif ($this->previousErrorHandler) {
152 return call_user_func($this->previousErrorHandler, $code, $message,
$file, $line, $context);
161 $this->reservedMemory = null;
163 $lastError = error_get_last();
164 if ($lastError && in_array($lastError[
'type'], self::$fatalErrors)) {
166 $this->fatalLevel === null ? LogLevel::ALERT : $this->fatalLevel,
167 'Fatal Error ('.self::codeToString($lastError[
'type']).
'): '.$lastError[
'message'],
168 array(
'code' => $lastError[
'type'],
'message' => $lastError[
'message'],
'file' => $lastError[
'file'],
'line' => $lastError[
'line'])
185 return 'E_CORE_ERROR';
187 return 'E_CORE_WARNING';
188 case E_COMPILE_ERROR:
189 return 'E_COMPILE_ERROR';
190 case E_COMPILE_WARNING:
191 return 'E_COMPILE_WARNING';
193 return 'E_USER_ERROR';
195 return 'E_USER_WARNING';
197 return 'E_USER_NOTICE';
200 case E_RECOVERABLE_ERROR:
201 return 'E_RECOVERABLE_ERROR';
203 return 'E_DEPRECATED';
204 case E_USER_DEPRECATED:
205 return 'E_USER_DEPRECATED';
208 return 'Unknown PHP error';
handleError($code, $message, $file='', $line=0, $context=array())
registerErrorHandler(array $levelMap=array(), $callPrevious=true, $errorTypes=-1)
registerFatalHandler($level=null, $reservedMemorySize=20)
registerExceptionHandler($level=null, $callPrevious=true)
__construct(LoggerInterface $logger)
$previousExceptionHandler
static codeToString($code)
Describes a logger instance.