diff --git a/src/Monolog/Formatter/FormatterInterface.php b/src/Monolog/Formatter/FormatterInterface.php index 309f0fec..18b8dd9d 100644 --- a/src/Monolog/Formatter/FormatterInterface.php +++ b/src/Monolog/Formatter/FormatterInterface.php @@ -1,17 +1,17 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -interface FormatterInterface -{ - function format($log, $level, $message); -} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +interface FormatterInterface +{ + function format($log, $level, $message); +} diff --git a/src/Monolog/Formatter/SimpleFormatter.php b/src/Monolog/Formatter/SimpleFormatter.php index bf0ee287..9c7f343c 100644 --- a/src/Monolog/Formatter/SimpleFormatter.php +++ b/src/Monolog/Formatter/SimpleFormatter.php @@ -1,48 +1,51 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -class SimpleFormatter implements FormatterInterface -{ - const SIMPLE_FORMAT = "[%date%] %log%.%level%: %message%\n"; - const SIMPLE_DATE = "Y-m-d H:i:s"; - - protected $format; - protected $dateFormat; - - public function __construct($format = null, $dateFormat = null) - { - $this->format = $format ?: self::SIMPLE_FORMAT; - $this->dateFormat = $dateFormat ?: self::SIMPLE_DATE; - } - - public function format($log, $level, $message) - { - $defaults = array( - 'log' => $log, - 'level' => $level, - 'date' => date($this->dateFormat), - ); - - if (is_array($message)) { - $vars = array_merge($defaults, $message); - } else { - $vars = $defaults; - $vars['message'] = $message; - } - - foreach ($vars as $var => $val) { - $message = str_replace('%'.$var.'%', $val, $message); - } - return $message; - } -} + + * + * 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 SimpleFormatter implements FormatterInterface +{ + const SIMPLE_FORMAT = "[%date%] %log%.%level%: %message%\n"; + const SIMPLE_DATE = "Y-m-d H:i:s"; + + protected $format; + protected $dateFormat; + + public function __construct($format = null, $dateFormat = null) + { + $this->format = $format ?: self::SIMPLE_FORMAT; + $this->dateFormat = $dateFormat ?: self::SIMPLE_DATE; + } + + public function format($log, $level, $message) + { + $defaults = array( + 'log' => $log, + 'level' => Logger::getLevelName($level), + 'date' => date($this->dateFormat), + ); + + if (is_array($message)) { + $vars = array_merge($defaults, $message); + } else { + $vars = $defaults; + $vars['message'] = $message; + } + + $message = $this->format; + foreach ($vars as $var => $val) { + $message = str_replace('%'.$var.'%', $val, $message); + } + return $message; + } +} diff --git a/src/Monolog/Log.php b/src/Monolog/Log.php index dfba48fd..049e971f 100644 --- a/src/Monolog/Log.php +++ b/src/Monolog/Log.php @@ -15,13 +15,15 @@ use Monolog\Writer\WriterInterface; class Log { + protected $level; protected $name; protected $writers; - public function __construct($name, $writers = array()) + public function __construct($name, $level = Logger::WARN, $writers = array()) { $this->name = $name; - $this->writers = $writers; + $this->level = $level; + $this->writers = (array) $writers; } public function getName() @@ -51,6 +53,6 @@ class Log public function getLevel() { - return $level; + return $this->level; } } diff --git a/src/Monolog/Logger.php b/src/Monolog/Logger.php index 39929cb5..3236656e 100644 --- a/src/Monolog/Logger.php +++ b/src/Monolog/Logger.php @@ -1,70 +1,83 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog; - -class Logger -{ - const DEBUG = 1; - const INFO = 5; - const WARN = 10; - const ERROR = 15; - const FATAL = 20; - - protected $logs; - - public function __construct($logs = array()) - { - $this->logs = $logs; - } - - public function addLog(Log $log) - { - $this->logs[$log->getName()] = $log; - } - - public function log($level, $message, $log = null) - { - if (null === $log) { - $logs = $this->logs; - } else { - $logs = (array) $log; - } - foreach ($logs as $log => $dummy) { - $this->logs[$log]->log($level, $message); - } - } - - public function debug($message, $log = null) - { - $this->log(self::DEBUG, $message, $log); - } - - public function info($message, $log = null) - { - $this->log(self::INFO, $message, $log); - } - - public function warn($message, $log = null) - { - $this->log(self::WARN, $message, $log); - } - - public function error($message, $log = null) - { - $this->log(self::ERROR, $message, $log); - } - - public function fatal($message, $log = null) - { - $this->log(self::FATAL, $message, $log); - } + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +class Logger +{ + const DEBUG = 1; + const INFO = 5; + const WARN = 10; + const ERROR = 15; + const FATAL = 20; + + protected static $levels = array( + 1 => 'DEBUG', + 5 => 'INFO', + 10 => 'WARN', + 15 => 'ERROR', + 20 => 'FATAL', + ); + + protected $logs; + + public function __construct($logs = array()) + { + $this->logs = (array) $logs; + } + + public function addLog(Log $log) + { + $this->logs[$log->getName()] = $log; + } + + public function log($level, $message, $log = null) + { + 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); + } + } + + public function debug($message, $log = null) + { + $this->log(self::DEBUG, $message, $log); + } + + public function info($message, $log = null) + { + $this->log(self::INFO, $message, $log); + } + + public function warn($message, $log = null) + { + $this->log(self::WARN, $message, $log); + } + + public function error($message, $log = null) + { + $this->log(self::ERROR, $message, $log); + } + + public function fatal($message, $log = null) + { + $this->log(self::FATAL, $message, $log); + } + + public static function getLevelName($level) + { + return self::$levels[$level]; + } } \ No newline at end of file diff --git a/src/Monolog/Writer/FileWriter.php b/src/Monolog/Writer/FileWriter.php index 032e7033..14993f0c 100644 --- a/src/Monolog/Writer/FileWriter.php +++ b/src/Monolog/Writer/FileWriter.php @@ -1,41 +1,41 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Writer; - -class FileWriter extends StreamWriter -{ - 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(); - // TODO rotation - } - - public function setRotation($rotation) - { - $this->rotation = $rotation; - } - - public function setMaxAge($maxAge) - { - $this->maxAge = $maxAge; - } + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Writer; + +class FileWriter extends StreamWriter +{ + 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(); + // TODO rotation + } + + public function setRotation($rotation) + { + $this->rotation = $rotation; + } + + public function setMaxAge($maxAge) + { + $this->maxAge = $maxAge; + } } \ No newline at end of file diff --git a/src/Monolog/Writer/NullWriter.php b/src/Monolog/Writer/NullWriter.php index c4d096cf..4ca4ae96 100644 --- a/src/Monolog/Writer/NullWriter.php +++ b/src/Monolog/Writer/NullWriter.php @@ -1,29 +1,29 @@ - - * - * 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, $level, $message) - { - } - - public function close() - { - } - - public function setFormatter(FormatterInterface $formatter) - { - } + + * + * 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, $level, $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 index faae5697..dd3042a2 100644 --- a/src/Monolog/Writer/StreamWriter.php +++ b/src/Monolog/Writer/StreamWriter.php @@ -1,48 +1,59 @@ - - * - * 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, $level, $message) - { - if (null === $this->stream) { - $this->stream = fopen($this->url, 'a'); - } - fwrite($this->stream, $this->formatter->format($log, $level, $message)); - } - - public function close() - { - fclose($this->stream); - } - - public function setFormatter(FormatterInterface $formatter) - { - $this->formatter = $formatter; - } + + * + * 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, $level, $message) + { + if (null === $this->stream) { + $this->stream = fopen($this->url, 'a'); + } + if ($this->formatter) { + $message = $this->formatter->format($log, $level, $message); + } + fwrite($this->stream, (string) $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/tests/Monolog/Formatter/SimpleFormatterTest.php b/tests/Monolog/Formatter/SimpleFormatterTest.php new file mode 100644 index 00000000..5dd310c5 --- /dev/null +++ b/tests/Monolog/Formatter/SimpleFormatterTest.php @@ -0,0 +1,35 @@ + + * + * 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 SimpleFormatterTest extends \PHPUnit_Framework_TestCase +{ + public function testDefFormatWithString() + { + $formatter = new SimpleFormatter(null, 'Y-m-d'); + $message = $formatter->format('log', Logger::WARN, 'foo'); + $this->assertEquals('['.date('Y-m-d').'] log.WARN: foo'."\n", $message); + } + + public function testDefFormatWithArray() + { + $formatter = new SimpleFormatter(null, 'Y-m-d'); + $message = $formatter->format('xx', Logger::FATAL, array( + 'log' => 'log', + 'level' => 'WARN', + 'message' => 'foo' + )); + $this->assertEquals('['.date('Y-m-d').'] log.WARN: foo'."\n", $message); + } +} diff --git a/tests/Monolog/LogTest.php b/tests/Monolog/LogTest.php new file mode 100644 index 00000000..44be6e96 --- /dev/null +++ b/tests/Monolog/LogTest.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +class LogTest extends \PHPUnit_Framework_TestCase +{ + public function testLog() + { + $logger = new Log('bob'); + $writer1 = $this->getMock('Monolog\Writer\NullWriter', array('write')); + $writer1->expects($this->once()) + ->method('write') + ->with('bob', Logger::WARN, 'test'); + $writer2 = $this->getMock('Monolog\Writer\NullWriter', array('write')); + $writer2->expects($this->once()) + ->method('write') + ->with('bob', Logger::WARN, 'test'); + $logger->addWriter($writer1); + $logger->addWriter($writer2); + $logger->log(Logger::WARN, 'test'); + } + + public function testLogLowLevel() + { + $logger = new Log('bob'); + $logger->setLevel(Logger::FATAL); + $this->assertEquals(Logger::FATAL, $logger->getLevel()); + + $writer1 = $this->getMock('Monolog\Writer\NullWriter', array('write')); + $writer1->expects($this->never()) + ->method('write'); + $logger->addWriter($writer1); + $logger->log(Logger::WARN, 'test'); + } +} diff --git a/tests/Monolog/LoggerTest.php b/tests/Monolog/LoggerTest.php new file mode 100644 index 00000000..ea65e645 --- /dev/null +++ b/tests/Monolog/LoggerTest.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +class LoggerTest extends \PHPUnit_Framework_TestCase +{ + public function testLogAll() + { + $logger = new Logger(); + $log1 = $this->getMock('Monolog\Log', array('log'), array('a')); + $log1->expects($this->once()) + ->method('log'); + $log2 = $this->getMock('Monolog\Log', array('log'), array('b')); + $log2->expects($this->once()) + ->method('log'); + $logger->addLog($log1); + $logger->addLog($log2); + $logger->warn('test'); + } + + public function testLogFiltered() + { + $logger = new Logger(); + $log1 = $this->getMock('Monolog\Log', array('log'), array('a')); + $log1->expects($this->exactly(2)) + ->method('log'); + $log2 = $this->getMock('Monolog\Log', array('log'), array('b')); + $log2->expects($this->never()) + ->method('log'); + $logger->addLog($log1); + $logger->addLog($log2); + + $logger->warn('test', 'a'); + $logger->warn('test', array('a')); + } +} diff --git a/tests/Monolog/Writer/StreamWriterTest.php b/tests/Monolog/Writer/StreamWriterTest.php new file mode 100644 index 00000000..7ff7726a --- /dev/null +++ b/tests/Monolog/Writer/StreamWriterTest.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Writer; + +use Monolog\Logger; + +class StreamWritterTest extends \PHPUnit_Framework_TestCase +{ + public function testWrite() + { + $handle = fopen('php://memory', 'a+'); + $writer = new StreamWriter($handle); + $writer->write('log', Logger::WARN, 'test'); + $writer->write('log', Logger::WARN, 'test2'); + $writer->write('log', Logger::WARN, 'test3'); + fseek($handle, 0); + $this->assertEquals('testtest2test3', fread($handle, 100)); + } + + public function testClose() + { + $handle = fopen('php://memory', 'a+'); + $writer = new StreamWriter($handle); + $this->assertTrue(is_resource($handle)); + $writer->close(); + $this->assertFalse(is_resource($handle)); + } +}