diff options
author | Jordi Boggiano <j.boggiano@seld.be> | 2011-02-20 20:52:52 +0100 |
---|---|---|
committer | Jordi Boggiano <j.boggiano@seld.be> | 2011-02-20 20:53:11 +0100 |
commit | 3fa6e4b91f8ce5dfdbad3560e716fb11f8c62fe1 (patch) | |
tree | 6939394dd8f06b443a9e515b4a5c3f6cdf1deb59 /src | |
parent | 860194e879ac673ffb614336d2700d3fb8bfa3ad (diff) | |
download | monolog-3fa6e4b91f8ce5dfdbad3560e716fb11f8c62fe1.zip monolog-3fa6e4b91f8ce5dfdbad3560e716fb11f8c62fe1.tar.gz monolog-3fa6e4b91f8ce5dfdbad3560e716fb11f8c62fe1.tar.bz2 |
Major refactoring to follow the Logbook model
Diffstat (limited to 'src')
-rw-r--r-- | src/Monolog/Formatter/FormatterInterface.php | 2 | ||||
-rw-r--r-- | src/Monolog/Formatter/JsonFormatter.php | 23 | ||||
-rw-r--r-- | src/Monolog/Formatter/LineFormatter.php (renamed from src/Monolog/Formatter/SimpleFormatter.php) | 29 | ||||
-rw-r--r-- | src/Monolog/Handler/AbstractHandler.php | 121 | ||||
-rw-r--r-- | src/Monolog/Handler/HandlerInterface.php | 29 | ||||
-rw-r--r-- | src/Monolog/Handler/NullHandler.php | 29 | ||||
-rw-r--r-- | src/Monolog/Handler/RotatingFileHandler.php (renamed from src/Monolog/Writer/FileWriter.php) | 11 | ||||
-rw-r--r-- | src/Monolog/Handler/StreamHandler.php | 53 | ||||
-rw-r--r-- | src/Monolog/Log.php | 59 | ||||
-rw-r--r-- | src/Monolog/Logger.php | 109 | ||||
-rw-r--r-- | src/Monolog/Processor/WebProcessor.php | 28 | ||||
-rw-r--r-- | src/Monolog/Writer/NullWriter.php | 29 | ||||
-rw-r--r-- | src/Monolog/Writer/StreamWriter.php | 59 | ||||
-rw-r--r-- | src/Monolog/Writer/WriterInterface.php | 21 |
14 files changed, 367 insertions, 235 deletions
diff --git a/src/Monolog/Formatter/FormatterInterface.php b/src/Monolog/Formatter/FormatterInterface.php index 1fa15e2..fd8233f 100644 --- a/src/Monolog/Formatter/FormatterInterface.php +++ b/src/Monolog/Formatter/FormatterInterface.php @@ -13,5 +13,5 @@ namespace Monolog\Formatter; interface FormatterInterface { - function format($log, $message); + function format($message); } diff --git a/src/Monolog/Formatter/JsonFormatter.php b/src/Monolog/Formatter/JsonFormatter.php new file mode 100644 index 0000000..335145c --- /dev/null +++ b/src/Monolog/Formatter/JsonFormatter.php @@ -0,0 +1,23 @@ +<?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\Formatter;
+
+use Monolog\Logger;
+
+class JsonFormatter implements FormatterInterface
+{
+ public function format($message)
+ {
+ $message['message'] = json_encode($message['message']);
+ return $message;
+ }
+}
diff --git a/src/Monolog/Formatter/SimpleFormatter.php b/src/Monolog/Formatter/LineFormatter.php index 3a2d2ee..e272fdc 100644 --- a/src/Monolog/Formatter/SimpleFormatter.php +++ b/src/Monolog/Formatter/LineFormatter.php @@ -13,9 +13,9 @@ namespace Monolog\Formatter; use Monolog\Logger; -class SimpleFormatter implements FormatterInterface +class LineFormatter implements FormatterInterface { - const SIMPLE_FORMAT = "[%date%] %log%.%level%: %message%\n"; + const SIMPLE_FORMAT = "[%datetime%] %channel%.%level_name%: %message%\n"; const SIMPLE_DATE = "Y-m-d H:i:s"; protected $format; @@ -27,25 +27,26 @@ class SimpleFormatter implements FormatterInterface $this->dateFormat = $dateFormat ?: self::SIMPLE_DATE; } - public function format($log, $message) + public function format($message) { - $defaults = array( - 'log' => $log, - 'level' => Logger::getLevelName($message['level']), - 'date' => date($this->dateFormat), - ); + $vars = $message; + $vars['datetime'] = $vars['datetime']->format($this->dateFormat); if (is_array($message['message'])) { - $vars = array_merge($defaults, $message['message']); - } else { - $vars = $defaults; - $vars['message'] = $message['message']; + unset($vars['message']); + $vars = array_merge($vars, $message['message']); } - $message = $this->format; + $output = $this->format; foreach ($vars as $var => $val) { - $message = str_replace('%'.$var.'%', $val, $message); + if (!is_array($val)) { + $output = str_replace('%'.$var.'%', $val, $output); + } } + foreach ($vars['extra'] as $var => $val) { + $output = str_replace('%extra.'.$var.'%', $val, $output); + } + $message['message'] = $output; return $message; } } diff --git a/src/Monolog/Handler/AbstractHandler.php b/src/Monolog/Handler/AbstractHandler.php new file mode 100644 index 0000000..90ff415 --- /dev/null +++ b/src/Monolog/Handler/AbstractHandler.php @@ -0,0 +1,121 @@ +<?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\Handler; + +use Monolog\Logger; +use Monolog\Formatter\LineFormatter; + +abstract class AbstractHandler implements HandlerInterface +{ + protected $level; + protected $bubble; + protected $parent; + + protected $formatter; + protected $processor; + + public function __construct($level = Logger::DEBUG, $bubble = false) + { + $this->level = $level; + $this->bubble = $bubble; + } + + public function handle($message) + { + if ($message['level'] < $this->level) { + return false; + } + + if ($this->processor) { + $message = call_user_func($this->processor, $message, $this); + } + + if (!$this->formatter) { + $this->formatter = $this->getDefaultFormatter(); + } + $message = $this->formatter->format($message); + + $this->write($message); + return false === $this->bubble; + } + + abstract public function write($message); + + public function close() + { + } + + public function setProcessor($callback) + { + $this->processor = $callback; + } + + public function getProcessor() + { + return $this->processor; + } + + public function setFormatter($formatter) + { + $this->formatter = $formatter; + } + + public function getFormatter() + { + return $this->formatter; + } + + public function setLevel($level) + { + $this->level = $level; + } + + public function getLevel() + { + return $this->level; + } + + public function setBubble($bubble) + { + $this->bubble = $bubble; + } + + public function getBubble() + { + return $this->bubble; + } + + public function getParent() + { + return $this->parent; + } + + /** + * Sets the parent handler + * + * @param Monolog\Handler\HandlerInterface + */ + public function setParent(HandlerInterface $parent) + { + $this->parent = $parent; + } + + public function __destruct() + { + $this->close(); + } + + protected function getDefaultFormatter() + { + return new LineFormatter(); + } +} diff --git a/src/Monolog/Handler/HandlerInterface.php b/src/Monolog/Handler/HandlerInterface.php new file mode 100644 index 0000000..81cff1f --- /dev/null +++ b/src/Monolog/Handler/HandlerInterface.php @@ -0,0 +1,29 @@ +<?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\Handler; + +interface HandlerInterface +{ + public function handle($message); + + public function setLevel($level); + + public function getLevel(); + + public function setBubble($bubble); + + public function getBubble(); + + public function getParent(); + + public function setParent(HandlerInterface $parent); +} diff --git a/src/Monolog/Handler/NullHandler.php b/src/Monolog/Handler/NullHandler.php new file mode 100644 index 0000000..cd7229e --- /dev/null +++ b/src/Monolog/Handler/NullHandler.php @@ -0,0 +1,29 @@ +<?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\Handler; + +use Monolog\Logger; + +class NullHandler extends AbstractHandler +{ + public function handle($message) + { + if ($message['level'] < $this->level) { + return false; + } + return false === $this->bubble; + } + + public function write($message) + { + } +}
\ No newline at end of file diff --git a/src/Monolog/Writer/FileWriter.php b/src/Monolog/Handler/RotatingFileHandler.php index 14993f0..694744d 100644 --- a/src/Monolog/Writer/FileWriter.php +++ b/src/Monolog/Handler/RotatingFileHandler.php @@ -9,20 +9,13 @@ * file that was distributed with this source code. */ -namespace Monolog\Writer; +namespace Monolog\Handler; -class FileWriter extends StreamWriter +class RotatingFileHandler extends StreamHandler { protected $rotation; protected $maxAge; - public function __construct($file, $rotation = null, $maxAge = null) - { - parent::__construct($file); - $this->rotation = $rotation; - $this->maxAge = $maxAge; - } - public function close() { parent::close(); diff --git a/src/Monolog/Handler/StreamHandler.php b/src/Monolog/Handler/StreamHandler.php new file mode 100644 index 0000000..1a1d527 --- /dev/null +++ b/src/Monolog/Handler/StreamHandler.php @@ -0,0 +1,53 @@ +<?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\Handler; + +use Monolog\Formatter\SimpleFormatter; +use Monolog\Logger; + +class StreamHandler extends AbstractHandler +{ + protected $stream; + protected $url; + + public function __construct($stream, $level = Logger::DEBUG, $bubble = true) + { + parent::__construct($level, $bubble); + if (is_resource($stream)) { + $this->stream = $stream; + } else { + $this->url = $stream; + } + } + + public function write($message) + { + if (null === $this->stream) { + if (!$this->url) { + throw new \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)) { + throw new \UnexpectedValueException('The stream could not be opened, "'.$this->url.'" may be an invalid url.'); + } + } + fwrite($this->stream, (string) $message['message']); + } + + public function close() + { + if (null !== $this->stream) { + fclose($this->stream); + $this->stream = null; + } + } +}
\ No newline at end of file diff --git a/src/Monolog/Log.php b/src/Monolog/Log.php deleted file mode 100644 index 253cf7d..0000000 --- a/src/Monolog/Log.php +++ /dev/null @@ -1,59 +0,0 @@ -<?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\Writer\WriterInterface; - -class Log -{ - protected $level; - protected $name; - protected $writers; - - public function __construct($name, $level = Logger::WARNING, $writers = array()) - { - $this->name = $name; - // TODO move level down to the writers - $this->level = $level; - $this->writers = is_array($writers) ? $writers : array($writers); - } - - public function getName() - { - return $this->name; - } - - public function addWriter(WriterInterface $writer) - { - $this->writers[] = $writer; - } - - public function addMessage($level, $message) - { - if ($level < $this->level) { - return; - } - foreach ($this->writers as $writer) { - $writer->write($this->name, $level, $message); - } - } - - public function setLevel($level) - { - $this->level = $level; - } - - public function getLevel() - { - return $this->level; - } -} diff --git a/src/Monolog/Logger.php b/src/Monolog/Logger.php index a220c87..93349e2 100644 --- a/src/Monolog/Logger.php +++ b/src/Monolog/Logger.php @@ -11,6 +11,9 @@ namespace Monolog; +use Monolog\Handler\HandlerInterface; +use Monolog\Handler\StreamHandler; + class Logger { /** @@ -42,104 +45,124 @@ class Logger 400 => 'ERROR', ); - protected $logs; + protected $name; + + /** + * The handler instance at the top of the handler stack + * + * @var Monolog\Handler\HandlerInterface + */ + protected $handler; - public function __construct($logs = array()) + public function __construct($name) { - $this->logs = array(); - if (!is_array($logs)) { - $logs = array($logs); - } - foreach ($logs as $log) { - $this->logs[$log->getName()] = $log; + $this->name = $name; + } + + public function pushHandler(HandlerInterface $handler) + { + if ($this->handler) { + $handler->setParent($this->handler); } + $this->handler = $handler; } - public function addLog(Log $log) + public function popHandler() { - $this->logs[$log->getName()] = $log; + if (null === $this->handler) { + throw new \LogicException('You tried to pop from an empty handler stack.'); + } + $top = $this->handler; + $this->handler = $top->getParent(); + return $top; } - public function addMessage($level, $message, $log = null) + public function addMessage($level, $message) { + if (null === $this->handler) { + $this->pushHandler(new StreamHandler('php://stderr', self::DEBUG)); + } $message = array( 'message' => $message, 'level' => $level, + 'level_name' => $this->getLevelName($level), + 'channel' => $this->name, + 'datetime' => new \DateTime(), + 'extra' => array(), ); - if (null === $log) { - $logs = $this->logs; - } else { - $logs = is_array($log) ? array_flip($log) : array($log => true); - } - foreach ($logs as $log => $dummy) { - $this->logs[$log]->log($level, $message); + $handled = false; + $handler = $this->handler; + while ($handler && true !== $handled) { + $handled = (bool) $handler->handle($message); + $handler = $handler->getParent(); } + return $handled; } - public function addDebug($message, $log = null) + public function addDebug($message, $channel = 'default') { - $this->addMessage(self::DEBUG, $message, $log); + $this->addMessage(self::DEBUG, $message, $channel); } - public function addInfo($message, $log = null) + public function addInfo($message, $channel = 'default') { - $this->addMessage(self::INFO, $message, $log); + $this->addMessage(self::INFO, $message, $channel); } - public function addWarning($message, $log = null) + public function addWarning($message, $channel = 'default') { - $this->addMessage(self::WARNING, $message, $log); + $this->addMessage(self::WARNING, $message, $channel); } - public function addError($message, $log = null) + public function addError($message, $channel = 'default') { - $this->addMessage(self::ERROR, $message, $log); + $this->addMessage(self::ERROR, $message, $channel); } - public static function getLevelName($level) + public function getLevelName($level) { return self::$levels[$level]; } // ZF Logger Compat - public function debug($message, $log = null) + public function debug($message, $channel = null) { - $this->addMessage(self::DEBUG, $message, $log); + $this->addMessage(self::DEBUG, $message, $channel); } - public function info($message, $log = null) + public function info($message, $channel = 'default') { - $this->addMessage(self::INFO, $message, $log); + $this->addMessage(self::INFO, $message, $channel); } - public function notice($message, $log = null) + public function notice($message, $channel = 'default') { - $this->addMessage(self::INFO, $message, $log); + $this->addMessage(self::INFO, $message, $channel); } - public function warn($message, $log = null) + public function warn($message, $channel = 'default') { - $this->addMessage(self::WARNING, $message, $log); + $this->addMessage(self::WARNING, $message, $channel); } - public function err($message, $log = null) + public function err($message, $channel = 'default') { - $this->addMessage(self::ERROR, $message, $log); + $this->addMessage(self::ERROR, $message, $channel); } - public function crit($message, $log = null) + public function crit($message, $channel = 'default') { - $this->addMessage(self::ERROR, $message, $log); + $this->addMessage(self::ERROR, $message, $channel); } - public function alert($message, $log = null) + public function alert($message, $channel = 'default') { - $this->addMessage(self::ERROR, $message, $log); + $this->addMessage(self::ERROR, $message, $channel); } - public function emerg($message, $log = null) + public function emerg($message, $channel = 'default') { - $this->addMessage(self::ERROR, $message, $log); + $this->addMessage(self::ERROR, $message, $channel); } }
\ No newline at end of file diff --git a/src/Monolog/Processor/WebProcessor.php b/src/Monolog/Processor/WebProcessor.php new file mode 100644 index 0000000..d463494 --- /dev/null +++ b/src/Monolog/Processor/WebProcessor.php @@ -0,0 +1,28 @@ +<?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\Processor; + +class WebProcessor +{ + public function __invoke($message, $handler) + { + $message['extra'] = array_merge( + $message['extra'], + array( + 'url' => $_SERVER['REQUEST_URI'], + 'ip' => $_SERVER['REMOTE_ADDR'], + 'method' => $_SERVER['REQUEST_METHOD'], + ) + ); + return $message; + } +} diff --git a/src/Monolog/Writer/NullWriter.php b/src/Monolog/Writer/NullWriter.php deleted file mode 100644 index c44a61f..0000000 --- a/src/Monolog/Writer/NullWriter.php +++ /dev/null @@ -1,29 +0,0 @@ -<?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\Writer; - -use Monolog\Formatter\FormatterInterface; - -class NullWriter implements WriterInterface -{ - public function write($log, $message) - { - } - - public function close() - { - } - - public function setFormatter(FormatterInterface $formatter) - { - } -}
\ No newline at end of file diff --git a/src/Monolog/Writer/StreamWriter.php b/src/Monolog/Writer/StreamWriter.php deleted file mode 100644 index 09d5203..0000000 --- a/src/Monolog/Writer/StreamWriter.php +++ /dev/null @@ -1,59 +0,0 @@ -<?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\Writer; - -use Monolog\Formatter\FormatterInterface; - -class StreamWriter implements WriterInterface -{ - protected $formatter; - protected $stream; - protected $url; - - public function __construct($streamUrl) - { - if (is_resource($streamUrl)) { - $this->stream = $streamUrl; - } else { - $this->url = $streamUrl; - } - } - - public function write($log, $message) - { - if (null === $this->stream) { - $this->stream = fopen($this->url, 'a'); - } - if ($this->formatter) { - $message = $this->formatter->format($log, $message); - } - fwrite($this->stream, (string) $message['message']); - } - - public function close() - { - fclose($this->stream); - $this->stream = null; - } - - public function setFormatter(FormatterInterface $formatter) - { - $this->formatter = $formatter; - } - - public function __destruct() - { - if (null !== $this->stream) { - $this->close(); - } - } -}
\ No newline at end of file diff --git a/src/Monolog/Writer/WriterInterface.php b/src/Monolog/Writer/WriterInterface.php deleted file mode 100644 index f8dffb3..0000000 --- a/src/Monolog/Writer/WriterInterface.php +++ /dev/null @@ -1,21 +0,0 @@ -<?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\Writer; - -use Monolog\Formatter\FormatterInterface; - -interface WriterInterface -{ - function setFormatter(FormatterInterface $formatter); - function write($log, $message); - function close(); -} |