summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJordi Boggiano <j.boggiano@seld.be>2011-02-20 20:52:52 +0100
committerJordi Boggiano <j.boggiano@seld.be>2011-02-20 20:53:11 +0100
commit3fa6e4b91f8ce5dfdbad3560e716fb11f8c62fe1 (patch)
tree6939394dd8f06b443a9e515b4a5c3f6cdf1deb59 /src
parent860194e879ac673ffb614336d2700d3fb8bfa3ad (diff)
downloadmonolog-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.php2
-rw-r--r--src/Monolog/Formatter/JsonFormatter.php23
-rw-r--r--src/Monolog/Formatter/LineFormatter.php (renamed from src/Monolog/Formatter/SimpleFormatter.php)29
-rw-r--r--src/Monolog/Handler/AbstractHandler.php121
-rw-r--r--src/Monolog/Handler/HandlerInterface.php29
-rw-r--r--src/Monolog/Handler/NullHandler.php29
-rw-r--r--src/Monolog/Handler/RotatingFileHandler.php (renamed from src/Monolog/Writer/FileWriter.php)11
-rw-r--r--src/Monolog/Handler/StreamHandler.php53
-rw-r--r--src/Monolog/Log.php59
-rw-r--r--src/Monolog/Logger.php109
-rw-r--r--src/Monolog/Processor/WebProcessor.php28
-rw-r--r--src/Monolog/Writer/NullWriter.php29
-rw-r--r--src/Monolog/Writer/StreamWriter.php59
-rw-r--r--src/Monolog/Writer/WriterInterface.php21
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();
-}