1
0
mirror of https://github.com/Seldaek/monolog.git synced 2025-10-22 00:56:08 +02:00

Custom exception handler (#500)

Add custom exception handler to let the user change the default
behavior when Monolog raise an exception while logging a record.
This commit is contained in:
Vincent Paré
2017-06-27 23:29:27 +02:00
parent fd8c787753
commit 207c91699e
2 changed files with 126 additions and 8 deletions

View File

@@ -133,6 +133,11 @@ class Logger implements LoggerInterface
*/
protected $microsecondTimestamps = true;
/**
* @var callable
*/
protected $exceptionHandler;
/**
* @param string $name The logging channel
* @param HandlerInterface[] $handlers Optional stack of handlers, the first one in the array is called first, etc.
@@ -329,16 +334,20 @@ class Logger implements LoggerInterface
'extra' => array(),
);
foreach ($this->processors as $processor) {
$record = call_user_func($processor, $record);
}
while ($handler = current($this->handlers)) {
if (true === $handler->handle($record)) {
break;
try {
foreach ($this->processors as $processor) {
$record = call_user_func($processor, $record);
}
next($this->handlers);
while ($handler = current($this->handlers)) {
if (true === $handler->handle($record)) {
break;
}
next($this->handlers);
}
} catch (\Exception $ex) {
$this->handleException($ex, $record);
}
return true;
@@ -501,6 +510,46 @@ class Logger implements LoggerInterface
return false;
}
/**
* Set a custom exception handler
*
* @param callable $callback
* @return $this
*/
public function setExceptionHandler($callback)
{
if (!is_callable($callback)) {
throw new \InvalidArgumentException('Exception handler must be valid callable (callback or object with an __invoke method), '.var_export($callback, true).' given');
}
$this->exceptionHandler = $callback;
return $this;
}
/**
* @return callable
*/
public function getExceptionHandler()
{
return $this->exceptionHandler;
}
/**
* Delegates exception management to the custom exception handler,
* or throws the exception if no custom handler is set.
*
* @param Exception $ex
* @param array $record
*/
protected function handleException(\Exception $ex, $record)
{
if ($this->exceptionHandler) {
call_user_func($this->exceptionHandler, $ex, $record);
} else {
throw $ex;
}
}
/**
* Adds a log record at an arbitrary level.
*