A super easy PHP Framework for web development!
				https://github.com/exacti/phacil-framework
			
			
		
			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.
		
		
		
		
		
			
		
			
				
					
					
						
							194 lines
						
					
					
						
							5.4 KiB
						
					
					
				
			
		
		
	
	
							194 lines
						
					
					
						
							5.4 KiB
						
					
					
				<?php
 | 
						|
 | 
						|
/*
 | 
						|
 * This file is part of Mustache.php.
 | 
						|
 *
 | 
						|
 * (c) 2010-2017 Justin Hileman
 | 
						|
 *
 | 
						|
 * For the full copyright and license information, please view the LICENSE
 | 
						|
 * file that was distributed with this source code.
 | 
						|
 */
 | 
						|
 | 
						|
/**
 | 
						|
 * A Mustache Stream Logger.
 | 
						|
 *
 | 
						|
 * The Stream Logger wraps a file resource instance (such as a stream) or a
 | 
						|
 * stream URL. All log messages over the threshold level will be appended to
 | 
						|
 * this stream.
 | 
						|
 *
 | 
						|
 * Hint: Try `php://stderr` for your stream URL.
 | 
						|
 */
 | 
						|
class Mustache_Logger_StreamLogger extends Mustache_Logger_AbstractLogger
 | 
						|
{
 | 
						|
    protected static $levels = array(
 | 
						|
        self::DEBUG     => 100,
 | 
						|
        self::INFO      => 200,
 | 
						|
        self::NOTICE    => 250,
 | 
						|
        self::WARNING   => 300,
 | 
						|
        self::ERROR     => 400,
 | 
						|
        self::CRITICAL  => 500,
 | 
						|
        self::ALERT     => 550,
 | 
						|
        self::EMERGENCY => 600,
 | 
						|
    );
 | 
						|
 | 
						|
    protected $level;
 | 
						|
    protected $stream = null;
 | 
						|
    protected $url    = null;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @throws InvalidArgumentException if the logging level is unknown
 | 
						|
     *
 | 
						|
     * @param resource|string $stream Resource instance or URL
 | 
						|
     * @param int             $level  The minimum logging level at which this handler will be triggered
 | 
						|
     */
 | 
						|
    public function __construct($stream, $level = Mustache_Logger::ERROR)
 | 
						|
    {
 | 
						|
        $this->setLevel($level);
 | 
						|
 | 
						|
        if (is_resource($stream)) {
 | 
						|
            $this->stream = $stream;
 | 
						|
        } else {
 | 
						|
            $this->url = $stream;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Close stream resources.
 | 
						|
     */
 | 
						|
    public function __destruct()
 | 
						|
    {
 | 
						|
        if (is_resource($this->stream)) {
 | 
						|
            fclose($this->stream);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Set the minimum logging level.
 | 
						|
     *
 | 
						|
     * @throws Mustache_Exception_InvalidArgumentException if the logging level is unknown
 | 
						|
     *
 | 
						|
     * @param int $level The minimum logging level which will be written
 | 
						|
     */
 | 
						|
    public function setLevel($level)
 | 
						|
    {
 | 
						|
        if (!array_key_exists($level, self::$levels)) {
 | 
						|
            throw new Mustache_Exception_InvalidArgumentException(sprintf('Unexpected logging level: %s', $level));
 | 
						|
        }
 | 
						|
 | 
						|
        $this->level = $level;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the current minimum logging level.
 | 
						|
     *
 | 
						|
     * @return int
 | 
						|
     */
 | 
						|
    public function getLevel()
 | 
						|
    {
 | 
						|
        return $this->level;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Logs with an arbitrary level.
 | 
						|
     *
 | 
						|
     * @throws Mustache_Exception_InvalidArgumentException if the logging level is unknown
 | 
						|
     *
 | 
						|
     * @param mixed  $level
 | 
						|
     * @param string $message
 | 
						|
     * @param array  $context
 | 
						|
     */
 | 
						|
    public function log($level, $message, array $context = array())
 | 
						|
    {
 | 
						|
        if (!array_key_exists($level, self::$levels)) {
 | 
						|
            throw new Mustache_Exception_InvalidArgumentException(sprintf('Unexpected logging level: %s', $level));
 | 
						|
        }
 | 
						|
 | 
						|
        if (self::$levels[$level] >= self::$levels[$this->level]) {
 | 
						|
            $this->writeLog($level, $message, $context);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Write a record to the log.
 | 
						|
     *
 | 
						|
     * @throws Mustache_Exception_LogicException   If neither a stream resource nor url is present
 | 
						|
     * @throws Mustache_Exception_RuntimeException If the stream url cannot be opened
 | 
						|
     *
 | 
						|
     * @param int    $level   The logging level
 | 
						|
     * @param string $message The log message
 | 
						|
     * @param array  $context The log context
 | 
						|
     */
 | 
						|
    protected function writeLog($level, $message, array $context = array())
 | 
						|
    {
 | 
						|
        if (!is_resource($this->stream)) {
 | 
						|
            if (!isset($this->url)) {
 | 
						|
                throw new Mustache_Exception_LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().');
 | 
						|
            }
 | 
						|
 | 
						|
            $this->stream = fopen($this->url, 'a');
 | 
						|
            if (!is_resource($this->stream)) {
 | 
						|
                // @codeCoverageIgnoreStart
 | 
						|
                throw new Mustache_Exception_RuntimeException(sprintf('The stream or file "%s" could not be opened.', $this->url));
 | 
						|
                // @codeCoverageIgnoreEnd
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        fwrite($this->stream, self::formatLine($level, $message, $context));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Gets the name of the logging level.
 | 
						|
     *
 | 
						|
     * @throws InvalidArgumentException if the logging level is unknown
 | 
						|
     *
 | 
						|
     * @param int $level
 | 
						|
     *
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    protected static function getLevelName($level)
 | 
						|
    {
 | 
						|
        return strtoupper($level);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Format a log line for output.
 | 
						|
     *
 | 
						|
     * @param int    $level   The logging level
 | 
						|
     * @param string $message The log message
 | 
						|
     * @param array  $context The log context
 | 
						|
     *
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    protected static function formatLine($level, $message, array $context = array())
 | 
						|
    {
 | 
						|
        return sprintf(
 | 
						|
            "%s: %s\n",
 | 
						|
            self::getLevelName($level),
 | 
						|
            self::interpolateMessage($message, $context)
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Interpolate context values into the message placeholders.
 | 
						|
     *
 | 
						|
     * @param string $message
 | 
						|
     * @param array  $context
 | 
						|
     *
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    protected static function interpolateMessage($message, array $context = array())
 | 
						|
    {
 | 
						|
        if (strpos($message, '{') === false) {
 | 
						|
            return $message;
 | 
						|
        }
 | 
						|
 | 
						|
        // build a replacement array with braces around the context keys
 | 
						|
        $replace = array();
 | 
						|
        foreach ($context as $key => $val) {
 | 
						|
            $replace['{' . $key . '}'] = $val;
 | 
						|
        }
 | 
						|
 | 
						|
        // interpolate replacement values into the the message and return
 | 
						|
        return strtr($message, $replace);
 | 
						|
    }
 | 
						|
}
 | 
						|
 |