792 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			PHP
		
	
	
	
		
		
			
		
	
	
			792 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			PHP
		
	
	
	
|  | <?php | ||
|  | 
 | ||
|  | /* | ||
|  |  * This file is part of the Monolog package. | ||
|  |  * | ||
|  |  * (c) Jordi Boggiano <j.boggiano@seld.be> | ||
|  |  * | ||
|  |  * For the full copyright and license information, please view the LICENSE | ||
|  |  * file that was distributed with this source code. | ||
|  |  */ | ||
|  | 
 | ||
|  | namespace Monolog; | ||
|  | 
 | ||
|  | use Monolog\Handler\HandlerInterface; | ||
|  | use Monolog\Handler\StreamHandler; | ||
|  | use Psr\Log\LoggerInterface; | ||
|  | use Psr\Log\InvalidArgumentException; | ||
|  | use Exception; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Monolog log channel | ||
|  |  * | ||
|  |  * It contains a stack of Handlers and a stack of Processors, | ||
|  |  * and uses them to store records that are added to it. | ||
|  |  * | ||
|  |  * @author Jordi Boggiano <j.boggiano@seld.be> | ||
|  |  */ | ||
|  | class Logger implements LoggerInterface, ResettableInterface | ||
|  | { | ||
|  |     /** | ||
|  |      * Detailed debug information | ||
|  |      */ | ||
|  |     const DEBUG = 100; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Interesting events | ||
|  |      * | ||
|  |      * Examples: User logs in, SQL logs. | ||
|  |      */ | ||
|  |     const INFO = 200; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Uncommon events | ||
|  |      */ | ||
|  |     const NOTICE = 250; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Exceptional occurrences that are not errors | ||
|  |      * | ||
|  |      * Examples: Use of deprecated APIs, poor use of an API, | ||
|  |      * undesirable things that are not necessarily wrong. | ||
|  |      */ | ||
|  |     const WARNING = 300; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Runtime errors | ||
|  |      */ | ||
|  |     const ERROR = 400; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Critical conditions | ||
|  |      * | ||
|  |      * Example: Application component unavailable, unexpected exception. | ||
|  |      */ | ||
|  |     const CRITICAL = 500; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Action must be taken immediately | ||
|  |      * | ||
|  |      * Example: Entire website down, database unavailable, etc. | ||
|  |      * This should trigger the SMS alerts and wake you up. | ||
|  |      */ | ||
|  |     const ALERT = 550; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Urgent alert. | ||
|  |      */ | ||
|  |     const EMERGENCY = 600; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Monolog API version | ||
|  |      * | ||
|  |      * This is only bumped when API breaks are done and should | ||
|  |      * follow the major version of the library | ||
|  |      * | ||
|  |      * @var int | ||
|  |      */ | ||
|  |     const API = 1; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Logging levels from syslog protocol defined in RFC 5424 | ||
|  |      * | ||
|  |      * @var array $levels Logging levels | ||
|  |      */ | ||
|  |     protected static $levels = array( | ||
|  |         self::DEBUG     => 'DEBUG', | ||
|  |         self::INFO      => 'INFO', | ||
|  |         self::NOTICE    => 'NOTICE', | ||
|  |         self::WARNING   => 'WARNING', | ||
|  |         self::ERROR     => 'ERROR', | ||
|  |         self::CRITICAL  => 'CRITICAL', | ||
|  |         self::ALERT     => 'ALERT', | ||
|  |         self::EMERGENCY => 'EMERGENCY', | ||
|  |     ); | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @var \DateTimeZone | ||
|  |      */ | ||
|  |     protected static $timezone; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @var string | ||
|  |      */ | ||
|  |     protected $name; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * The handler stack | ||
|  |      * | ||
|  |      * @var HandlerInterface[] | ||
|  |      */ | ||
|  |     protected $handlers; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Processors that will process all log records | ||
|  |      * | ||
|  |      * To process records of a single handler instead, add the processor on that specific handler | ||
|  |      * | ||
|  |      * @var callable[] | ||
|  |      */ | ||
|  |     protected $processors; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @var bool | ||
|  |      */ | ||
|  |     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. | ||
|  |      * @param callable[]         $processors Optional array of processors | ||
|  |      */ | ||
|  |     public function __construct($name, array $handlers = array(), array $processors = array()) | ||
|  |     { | ||
|  |         $this->name = $name; | ||
|  |         $this->setHandlers($handlers); | ||
|  |         $this->processors = $processors; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @return string | ||
|  |      */ | ||
|  |     public function getName() | ||
|  |     { | ||
|  |         return $this->name; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Return a new cloned instance with the name changed | ||
|  |      * | ||
|  |      * @return static | ||
|  |      */ | ||
|  |     public function withName($name) | ||
|  |     { | ||
|  |         $new = clone $this; | ||
|  |         $new->name = $name; | ||
|  | 
 | ||
|  |         return $new; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Pushes a handler on to the stack. | ||
|  |      * | ||
|  |      * @param  HandlerInterface $handler | ||
|  |      * @return $this | ||
|  |      */ | ||
|  |     public function pushHandler(HandlerInterface $handler) | ||
|  |     { | ||
|  |         array_unshift($this->handlers, $handler); | ||
|  | 
 | ||
|  |         return $this; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Pops a handler from the stack | ||
|  |      * | ||
|  |      * @return HandlerInterface | ||
|  |      */ | ||
|  |     public function popHandler() | ||
|  |     { | ||
|  |         if (!$this->handlers) { | ||
|  |             throw new \LogicException('You tried to pop from an empty handler stack.'); | ||
|  |         } | ||
|  | 
 | ||
|  |         return array_shift($this->handlers); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Set handlers, replacing all existing ones. | ||
|  |      * | ||
|  |      * If a map is passed, keys will be ignored. | ||
|  |      * | ||
|  |      * @param  HandlerInterface[] $handlers | ||
|  |      * @return $this | ||
|  |      */ | ||
|  |     public function setHandlers(array $handlers) | ||
|  |     { | ||
|  |         $this->handlers = array(); | ||
|  |         foreach (array_reverse($handlers) as $handler) { | ||
|  |             $this->pushHandler($handler); | ||
|  |         } | ||
|  | 
 | ||
|  |         return $this; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @return HandlerInterface[] | ||
|  |      */ | ||
|  |     public function getHandlers() | ||
|  |     { | ||
|  |         return $this->handlers; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a processor on to the stack. | ||
|  |      * | ||
|  |      * @param  callable $callback | ||
|  |      * @return $this | ||
|  |      */ | ||
|  |     public function pushProcessor($callback) | ||
|  |     { | ||
|  |         if (!is_callable($callback)) { | ||
|  |             throw new \InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), '.var_export($callback, true).' given'); | ||
|  |         } | ||
|  |         array_unshift($this->processors, $callback); | ||
|  | 
 | ||
|  |         return $this; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Removes the processor on top of the stack and returns it. | ||
|  |      * | ||
|  |      * @return callable | ||
|  |      */ | ||
|  |     public function popProcessor() | ||
|  |     { | ||
|  |         if (!$this->processors) { | ||
|  |             throw new \LogicException('You tried to pop from an empty processor stack.'); | ||
|  |         } | ||
|  | 
 | ||
|  |         return array_shift($this->processors); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @return callable[] | ||
|  |      */ | ||
|  |     public function getProcessors() | ||
|  |     { | ||
|  |         return $this->processors; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Control the use of microsecond resolution timestamps in the 'datetime' | ||
|  |      * member of new records. | ||
|  |      * | ||
|  |      * Generating microsecond resolution timestamps by calling | ||
|  |      * microtime(true), formatting the result via sprintf() and then parsing | ||
|  |      * the resulting string via \DateTime::createFromFormat() can incur | ||
|  |      * a measurable runtime overhead vs simple usage of DateTime to capture | ||
|  |      * a second resolution timestamp in systems which generate a large number | ||
|  |      * of log events. | ||
|  |      * | ||
|  |      * @param bool $micro True to use microtime() to create timestamps | ||
|  |      */ | ||
|  |     public function useMicrosecondTimestamps($micro) | ||
|  |     { | ||
|  |         $this->microsecondTimestamps = (bool) $micro; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record. | ||
|  |      * | ||
|  |      * @param  int     $level   The logging level | ||
|  |      * @param  string  $message The log message | ||
|  |      * @param  array   $context The log context | ||
|  |      * @return bool Whether the record has been processed | ||
|  |      */ | ||
|  |     public function addRecord($level, $message, array $context = array()) | ||
|  |     { | ||
|  |         if (!$this->handlers) { | ||
|  |             $this->pushHandler(new StreamHandler('php://stderr', static::DEBUG)); | ||
|  |         } | ||
|  | 
 | ||
|  |         $levelName = static::getLevelName($level); | ||
|  | 
 | ||
|  |         // check if any handler will handle this message so we can return early and save cycles
 | ||
|  |         $handlerKey = null; | ||
|  |         reset($this->handlers); | ||
|  |         while ($handler = current($this->handlers)) { | ||
|  |             if ($handler->isHandling(array('level' => $level))) { | ||
|  |                 $handlerKey = key($this->handlers); | ||
|  |                 break; | ||
|  |             } | ||
|  | 
 | ||
|  |             next($this->handlers); | ||
|  |         } | ||
|  | 
 | ||
|  |         if (null === $handlerKey) { | ||
|  |             return false; | ||
|  |         } | ||
|  | 
 | ||
|  |         if (!static::$timezone) { | ||
|  |             static::$timezone = new \DateTimeZone(date_default_timezone_get() ?: 'UTC'); | ||
|  |         } | ||
|  | 
 | ||
|  |         // php7.1+ always has microseconds enabled, so we do not need this hack
 | ||
|  |         if ($this->microsecondTimestamps && PHP_VERSION_ID < 70100) { | ||
|  |             $ts = \DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true)), static::$timezone); | ||
|  |         } else { | ||
|  |             $ts = new \DateTime(null, static::$timezone); | ||
|  |         } | ||
|  |         $ts->setTimezone(static::$timezone); | ||
|  | 
 | ||
|  |         $record = array( | ||
|  |             'message' => (string) $message, | ||
|  |             'context' => $context, | ||
|  |             'level' => $level, | ||
|  |             'level_name' => $levelName, | ||
|  |             'channel' => $this->name, | ||
|  |             'datetime' => $ts, | ||
|  |             'extra' => array(), | ||
|  |         ); | ||
|  | 
 | ||
|  |         try { | ||
|  |             foreach ($this->processors as $processor) { | ||
|  |                 $record = call_user_func($processor, $record); | ||
|  |             } | ||
|  | 
 | ||
|  |             while ($handler = current($this->handlers)) { | ||
|  |                 if (true === $handler->handle($record)) { | ||
|  |                     break; | ||
|  |                 } | ||
|  | 
 | ||
|  |                 next($this->handlers); | ||
|  |             } | ||
|  |         } catch (Exception $e) { | ||
|  |             $this->handleException($e, $record); | ||
|  |         } | ||
|  | 
 | ||
|  |         return true; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Ends a log cycle and frees all resources used by handlers. | ||
|  |      * | ||
|  |      * Closing a Handler means flushing all buffers and freeing any open resources/handles. | ||
|  |      * Handlers that have been closed should be able to accept log records again and re-open | ||
|  |      * themselves on demand, but this may not always be possible depending on implementation. | ||
|  |      * | ||
|  |      * This is useful at the end of a request and will be called automatically on every handler | ||
|  |      * when they get destructed. | ||
|  |      */ | ||
|  |     public function close() | ||
|  |     { | ||
|  |         foreach ($this->handlers as $handler) { | ||
|  |             if (method_exists($handler, 'close')) { | ||
|  |                 $handler->close(); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Ends a log cycle and resets all handlers and processors to their initial state. | ||
|  |      * | ||
|  |      * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal | ||
|  |      * state, and getting it back to a state in which it can receive log records again. | ||
|  |      * | ||
|  |      * This is useful in case you want to avoid logs leaking between two requests or jobs when you | ||
|  |      * have a long running process like a worker or an application server serving multiple requests | ||
|  |      * in one process. | ||
|  |      */ | ||
|  |     public function reset() | ||
|  |     { | ||
|  |         foreach ($this->handlers as $handler) { | ||
|  |             if ($handler instanceof ResettableInterface) { | ||
|  |                 $handler->reset(); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         foreach ($this->processors as $processor) { | ||
|  |             if ($processor instanceof ResettableInterface) { | ||
|  |                 $processor->reset(); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the DEBUG level. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function addDebug($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::DEBUG, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the INFO level. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function addInfo($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::INFO, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the NOTICE level. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function addNotice($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::NOTICE, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the WARNING level. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function addWarning($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::WARNING, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the ERROR level. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function addError($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::ERROR, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the CRITICAL level. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function addCritical($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::CRITICAL, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the ALERT level. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function addAlert($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::ALERT, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the EMERGENCY level. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function addEmergency($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::EMERGENCY, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Gets all supported logging levels. | ||
|  |      * | ||
|  |      * @return array Assoc array with human-readable level names => level codes. | ||
|  |      */ | ||
|  |     public static function getLevels() | ||
|  |     { | ||
|  |         return array_flip(static::$levels); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Gets the name of the logging level. | ||
|  |      * | ||
|  |      * @param  int    $level | ||
|  |      * @return string | ||
|  |      */ | ||
|  |     public static function getLevelName($level) | ||
|  |     { | ||
|  |         if (!isset(static::$levels[$level])) { | ||
|  |             throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', array_keys(static::$levels))); | ||
|  |         } | ||
|  | 
 | ||
|  |         return static::$levels[$level]; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Converts PSR-3 levels to Monolog ones if necessary | ||
|  |      * | ||
|  |      * @param string|int Level number (monolog) or name (PSR-3) | ||
|  |      * @return int | ||
|  |      */ | ||
|  |     public static function toMonologLevel($level) | ||
|  |     { | ||
|  |         if (is_string($level) && defined(__CLASS__.'::'.strtoupper($level))) { | ||
|  |             return constant(__CLASS__.'::'.strtoupper($level)); | ||
|  |         } | ||
|  | 
 | ||
|  |         return $level; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Checks whether the Logger has a handler that listens on the given level | ||
|  |      * | ||
|  |      * @param  int     $level | ||
|  |      * @return bool | ||
|  |      */ | ||
|  |     public function isHandling($level) | ||
|  |     { | ||
|  |         $record = array( | ||
|  |             'level' => $level, | ||
|  |         ); | ||
|  | 
 | ||
|  |         foreach ($this->handlers as $handler) { | ||
|  |             if ($handler->isHandling($record)) { | ||
|  |                 return true; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         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. | ||
|  |      */ | ||
|  |     protected function handleException(Exception $e, array $record) | ||
|  |     { | ||
|  |         if (!$this->exceptionHandler) { | ||
|  |             throw $e; | ||
|  |         } | ||
|  | 
 | ||
|  |         call_user_func($this->exceptionHandler, $e, $record); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at an arbitrary level. | ||
|  |      * | ||
|  |      * This method allows for compatibility with common interfaces. | ||
|  |      * | ||
|  |      * @param  mixed   $level   The log level | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function log($level, $message, array $context = array()) | ||
|  |     { | ||
|  |         $level = static::toMonologLevel($level); | ||
|  | 
 | ||
|  |         return $this->addRecord($level, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the DEBUG level. | ||
|  |      * | ||
|  |      * This method allows for compatibility with common interfaces. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function debug($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::DEBUG, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the INFO level. | ||
|  |      * | ||
|  |      * This method allows for compatibility with common interfaces. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function info($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::INFO, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the NOTICE level. | ||
|  |      * | ||
|  |      * This method allows for compatibility with common interfaces. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function notice($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::NOTICE, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the WARNING level. | ||
|  |      * | ||
|  |      * This method allows for compatibility with common interfaces. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function warn($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::WARNING, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the WARNING level. | ||
|  |      * | ||
|  |      * This method allows for compatibility with common interfaces. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function warning($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::WARNING, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the ERROR level. | ||
|  |      * | ||
|  |      * This method allows for compatibility with common interfaces. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function err($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::ERROR, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the ERROR level. | ||
|  |      * | ||
|  |      * This method allows for compatibility with common interfaces. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function error($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::ERROR, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the CRITICAL level. | ||
|  |      * | ||
|  |      * This method allows for compatibility with common interfaces. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function crit($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::CRITICAL, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the CRITICAL level. | ||
|  |      * | ||
|  |      * This method allows for compatibility with common interfaces. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function critical($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::CRITICAL, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the ALERT level. | ||
|  |      * | ||
|  |      * This method allows for compatibility with common interfaces. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function alert($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::ALERT, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the EMERGENCY level. | ||
|  |      * | ||
|  |      * This method allows for compatibility with common interfaces. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function emerg($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::EMERGENCY, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Adds a log record at the EMERGENCY level. | ||
|  |      * | ||
|  |      * This method allows for compatibility with common interfaces. | ||
|  |      * | ||
|  |      * @param  string $message The log message | ||
|  |      * @param  array  $context The log context | ||
|  |      * @return bool   Whether the record has been processed | ||
|  |      */ | ||
|  |     public function emergency($message, array $context = array()) | ||
|  |     { | ||
|  |         return $this->addRecord(static::EMERGENCY, $message, $context); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Set the timezone to be used for the timestamp of log records. | ||
|  |      * | ||
|  |      * This is stored globally for all Logger instances | ||
|  |      * | ||
|  |      * @param \DateTimeZone $tz Timezone object | ||
|  |      */ | ||
|  |     public static function setTimezone(\DateTimeZone $tz) | ||
|  |     { | ||
|  |         self::$timezone = $tz; | ||
|  |     } | ||
|  | } |