You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
310 lines
7.2 KiB
310 lines
7.2 KiB
<?php |
|
|
|
namespace Illuminate\Log; |
|
|
|
use Closure; |
|
use Illuminate\Contracts\Events\Dispatcher; |
|
use Illuminate\Contracts\Support\Arrayable; |
|
use Illuminate\Contracts\Support\Jsonable; |
|
use Illuminate\Log\Events\MessageLogged; |
|
use Psr\Log\LoggerInterface; |
|
use RuntimeException; |
|
|
|
class Logger implements LoggerInterface |
|
{ |
|
/** |
|
* The underlying logger implementation. |
|
* |
|
* @var \Psr\Log\LoggerInterface |
|
*/ |
|
protected $logger; |
|
|
|
/** |
|
* The event dispatcher instance. |
|
* |
|
* @var \Illuminate\Contracts\Events\Dispatcher|null |
|
*/ |
|
protected $dispatcher; |
|
|
|
/** |
|
* Any context to be added to logs. |
|
* |
|
* @var array |
|
*/ |
|
protected $context = []; |
|
|
|
/** |
|
* Create a new log writer instance. |
|
* |
|
* @param \Psr\Log\LoggerInterface $logger |
|
* @param \Illuminate\Contracts\Events\Dispatcher|null $dispatcher |
|
* @return void |
|
*/ |
|
public function __construct(LoggerInterface $logger, Dispatcher $dispatcher = null) |
|
{ |
|
$this->logger = $logger; |
|
$this->dispatcher = $dispatcher; |
|
} |
|
|
|
/** |
|
* Log an emergency message to the logs. |
|
* |
|
* @param string $message |
|
* @param array $context |
|
* @return void |
|
*/ |
|
public function emergency($message, array $context = []) |
|
{ |
|
$this->writeLog(__FUNCTION__, $message, $context); |
|
} |
|
|
|
/** |
|
* Log an alert message to the logs. |
|
* |
|
* @param string $message |
|
* @param array $context |
|
* @return void |
|
*/ |
|
public function alert($message, array $context = []) |
|
{ |
|
$this->writeLog(__FUNCTION__, $message, $context); |
|
} |
|
|
|
/** |
|
* Log a critical message to the logs. |
|
* |
|
* @param string $message |
|
* @param array $context |
|
* @return void |
|
*/ |
|
public function critical($message, array $context = []) |
|
{ |
|
$this->writeLog(__FUNCTION__, $message, $context); |
|
} |
|
|
|
/** |
|
* Log an error message to the logs. |
|
* |
|
* @param string $message |
|
* @param array $context |
|
* @return void |
|
*/ |
|
public function error($message, array $context = []) |
|
{ |
|
$this->writeLog(__FUNCTION__, $message, $context); |
|
} |
|
|
|
/** |
|
* Log a warning message to the logs. |
|
* |
|
* @param string $message |
|
* @param array $context |
|
* @return void |
|
*/ |
|
public function warning($message, array $context = []) |
|
{ |
|
$this->writeLog(__FUNCTION__, $message, $context); |
|
} |
|
|
|
/** |
|
* Log a notice to the logs. |
|
* |
|
* @param string $message |
|
* @param array $context |
|
* @return void |
|
*/ |
|
public function notice($message, array $context = []) |
|
{ |
|
$this->writeLog(__FUNCTION__, $message, $context); |
|
} |
|
|
|
/** |
|
* Log an informational message to the logs. |
|
* |
|
* @param string $message |
|
* @param array $context |
|
* @return void |
|
*/ |
|
public function info($message, array $context = []) |
|
{ |
|
$this->writeLog(__FUNCTION__, $message, $context); |
|
} |
|
|
|
/** |
|
* Log a debug message to the logs. |
|
* |
|
* @param string $message |
|
* @param array $context |
|
* @return void |
|
*/ |
|
public function debug($message, array $context = []) |
|
{ |
|
$this->writeLog(__FUNCTION__, $message, $context); |
|
} |
|
|
|
/** |
|
* Log a message to the logs. |
|
* |
|
* @param string $level |
|
* @param string $message |
|
* @param array $context |
|
* @return void |
|
*/ |
|
public function log($level, $message, array $context = []) |
|
{ |
|
$this->writeLog($level, $message, $context); |
|
} |
|
|
|
/** |
|
* Dynamically pass log calls into the writer. |
|
* |
|
* @param string $level |
|
* @param string $message |
|
* @param array $context |
|
* @return void |
|
*/ |
|
public function write($level, $message, array $context = []) |
|
{ |
|
$this->writeLog($level, $message, $context); |
|
} |
|
|
|
/** |
|
* Write a message to the log. |
|
* |
|
* @param string $level |
|
* @param string $message |
|
* @param array $context |
|
* @return void |
|
*/ |
|
protected function writeLog($level, $message, $context) |
|
{ |
|
$this->logger->{$level}( |
|
$message = $this->formatMessage($message), |
|
$context = array_merge($this->context, $context) |
|
); |
|
|
|
$this->fireLogEvent($level, $message, $context); |
|
} |
|
|
|
/** |
|
* Add context to all future logs. |
|
* |
|
* @param array $context |
|
* @return $this |
|
*/ |
|
public function withContext(array $context = []) |
|
{ |
|
$this->context = array_merge($this->context, $context); |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* Flush the existing context array. |
|
* |
|
* @return $this |
|
*/ |
|
public function withoutContext() |
|
{ |
|
$this->context = []; |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* Register a new callback handler for when a log event is triggered. |
|
* |
|
* @param \Closure $callback |
|
* @return void |
|
* |
|
* @throws \RuntimeException |
|
*/ |
|
public function listen(Closure $callback) |
|
{ |
|
if (! isset($this->dispatcher)) { |
|
throw new RuntimeException('Events dispatcher has not been set.'); |
|
} |
|
|
|
$this->dispatcher->listen(MessageLogged::class, $callback); |
|
} |
|
|
|
/** |
|
* Fires a log event. |
|
* |
|
* @param string $level |
|
* @param string $message |
|
* @param array $context |
|
* @return void |
|
*/ |
|
protected function fireLogEvent($level, $message, array $context = []) |
|
{ |
|
// If the event dispatcher is set, we will pass along the parameters to the |
|
// log listeners. These are useful for building profilers or other tools |
|
// that aggregate all of the log messages for a given "request" cycle. |
|
if (isset($this->dispatcher)) { |
|
$this->dispatcher->dispatch(new MessageLogged($level, $message, $context)); |
|
} |
|
} |
|
|
|
/** |
|
* Format the parameters for the logger. |
|
* |
|
* @param mixed $message |
|
* @return mixed |
|
*/ |
|
protected function formatMessage($message) |
|
{ |
|
if (is_array($message)) { |
|
return var_export($message, true); |
|
} elseif ($message instanceof Jsonable) { |
|
return $message->toJson(); |
|
} elseif ($message instanceof Arrayable) { |
|
return var_export($message->toArray(), true); |
|
} |
|
|
|
return $message; |
|
} |
|
|
|
/** |
|
* Get the underlying logger implementation. |
|
* |
|
* @return \Psr\Log\LoggerInterface |
|
*/ |
|
public function getLogger() |
|
{ |
|
return $this->logger; |
|
} |
|
|
|
/** |
|
* Get the event dispatcher instance. |
|
* |
|
* @return \Illuminate\Contracts\Events\Dispatcher |
|
*/ |
|
public function getEventDispatcher() |
|
{ |
|
return $this->dispatcher; |
|
} |
|
|
|
/** |
|
* Set the event dispatcher instance. |
|
* |
|
* @param \Illuminate\Contracts\Events\Dispatcher $dispatcher |
|
* @return void |
|
*/ |
|
public function setEventDispatcher(Dispatcher $dispatcher) |
|
{ |
|
$this->dispatcher = $dispatcher; |
|
} |
|
|
|
/** |
|
* Dynamically proxy method calls to the underlying logger. |
|
* |
|
* @param string $method |
|
* @param array $parameters |
|
* @return mixed |
|
*/ |
|
public function __call($method, $parameters) |
|
{ |
|
return $this->logger->{$method}(...$parameters); |
|
} |
|
}
|
|
|