1
0
mirror of https://github.com/Seldaek/monolog.git synced 2025-08-05 04:37:38 +02:00

Added tests, fixed a bunch of bugs

This commit is contained in:
Jordi Boggiano
2011-02-17 02:50:24 +01:00
parent ed6b0e32a2
commit 7239b5203b
11 changed files with 442 additions and 252 deletions

View File

@@ -1,17 +1,17 @@
<?php <?php
/* /*
* This file is part of the Monolog package. * This file is part of the Monolog package.
* *
* (c) Jordi Boggiano <j.boggiano@seld.be> * (c) Jordi Boggiano <j.boggiano@seld.be>
* *
* For the full copyright and license information, please view the LICENSE * For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code. * file that was distributed with this source code.
*/ */
namespace Monolog\Formatter; namespace Monolog\Formatter;
interface FormatterInterface interface FormatterInterface
{ {
function format($log, $level, $message); function format($log, $level, $message);
} }

View File

@@ -1,48 +1,51 @@
<?php <?php
/* /*
* This file is part of the Monolog package. * This file is part of the Monolog package.
* *
* (c) Jordi Boggiano <j.boggiano@seld.be> * (c) Jordi Boggiano <j.boggiano@seld.be>
* *
* For the full copyright and license information, please view the LICENSE * For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code. * file that was distributed with this source code.
*/ */
namespace Monolog\Formatter; namespace Monolog\Formatter;
class SimpleFormatter implements FormatterInterface use Monolog\Logger;
{
const SIMPLE_FORMAT = "[%date%] %log%.%level%: %message%\n"; class SimpleFormatter implements FormatterInterface
const SIMPLE_DATE = "Y-m-d H:i:s"; {
const SIMPLE_FORMAT = "[%date%] %log%.%level%: %message%\n";
protected $format; const SIMPLE_DATE = "Y-m-d H:i:s";
protected $dateFormat;
protected $format;
public function __construct($format = null, $dateFormat = null) protected $dateFormat;
{
$this->format = $format ?: self::SIMPLE_FORMAT; public function __construct($format = null, $dateFormat = null)
$this->dateFormat = $dateFormat ?: self::SIMPLE_DATE; {
} $this->format = $format ?: self::SIMPLE_FORMAT;
$this->dateFormat = $dateFormat ?: self::SIMPLE_DATE;
public function format($log, $level, $message) }
{
$defaults = array( public function format($log, $level, $message)
'log' => $log, {
'level' => $level, $defaults = array(
'date' => date($this->dateFormat), 'log' => $log,
); 'level' => Logger::getLevelName($level),
'date' => date($this->dateFormat),
if (is_array($message)) { );
$vars = array_merge($defaults, $message);
} else { if (is_array($message)) {
$vars = $defaults; $vars = array_merge($defaults, $message);
$vars['message'] = $message; } else {
} $vars = $defaults;
$vars['message'] = $message;
foreach ($vars as $var => $val) { }
$message = str_replace('%'.$var.'%', $val, $message);
} $message = $this->format;
return $message; foreach ($vars as $var => $val) {
} $message = str_replace('%'.$var.'%', $val, $message);
} }
return $message;
}
}

View File

@@ -15,13 +15,15 @@ use Monolog\Writer\WriterInterface;
class Log class Log
{ {
protected $level;
protected $name; protected $name;
protected $writers; protected $writers;
public function __construct($name, $writers = array()) public function __construct($name, $level = Logger::WARN, $writers = array())
{ {
$this->name = $name; $this->name = $name;
$this->writers = $writers; $this->level = $level;
$this->writers = (array) $writers;
} }
public function getName() public function getName()
@@ -51,6 +53,6 @@ class Log
public function getLevel() public function getLevel()
{ {
return $level; return $this->level;
} }
} }

View File

@@ -1,70 +1,83 @@
<?php <?php
/* /*
* This file is part of the Monolog package. * This file is part of the Monolog package.
* *
* (c) Jordi Boggiano <j.boggiano@seld.be> * (c) Jordi Boggiano <j.boggiano@seld.be>
* *
* For the full copyright and license information, please view the LICENSE * For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code. * file that was distributed with this source code.
*/ */
namespace Monolog; namespace Monolog;
class Logger class Logger
{ {
const DEBUG = 1; const DEBUG = 1;
const INFO = 5; const INFO = 5;
const WARN = 10; const WARN = 10;
const ERROR = 15; const ERROR = 15;
const FATAL = 20; const FATAL = 20;
protected $logs; protected static $levels = array(
1 => 'DEBUG',
public function __construct($logs = array()) 5 => 'INFO',
{ 10 => 'WARN',
$this->logs = $logs; 15 => 'ERROR',
} 20 => 'FATAL',
);
public function addLog(Log $log)
{ protected $logs;
$this->logs[$log->getName()] = $log;
} public function __construct($logs = array())
{
public function log($level, $message, $log = null) $this->logs = (array) $logs;
{ }
if (null === $log) {
$logs = $this->logs; public function addLog(Log $log)
} else { {
$logs = (array) $log; $this->logs[$log->getName()] = $log;
} }
foreach ($logs as $log => $dummy) {
$this->logs[$log]->log($level, $message); public function log($level, $message, $log = null)
} {
} if (null === $log) {
$logs = $this->logs;
public function debug($message, $log = null) } else {
{ $logs = is_array($log) ? array_flip($log) : array($log => true);
$this->log(self::DEBUG, $message, $log); }
} foreach ($logs as $log => $dummy) {
$this->logs[$log]->log($level, $message);
public function info($message, $log = null) }
{ }
$this->log(self::INFO, $message, $log);
} public function debug($message, $log = null)
{
public function warn($message, $log = null) $this->log(self::DEBUG, $message, $log);
{ }
$this->log(self::WARN, $message, $log);
} public function info($message, $log = null)
{
public function error($message, $log = null) $this->log(self::INFO, $message, $log);
{ }
$this->log(self::ERROR, $message, $log);
} public function warn($message, $log = null)
{
public function fatal($message, $log = null) $this->log(self::WARN, $message, $log);
{ }
$this->log(self::FATAL, $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];
}
} }

View File

@@ -1,41 +1,41 @@
<?php <?php
/* /*
* This file is part of the Monolog package. * This file is part of the Monolog package.
* *
* (c) Jordi Boggiano <j.boggiano@seld.be> * (c) Jordi Boggiano <j.boggiano@seld.be>
* *
* For the full copyright and license information, please view the LICENSE * For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code. * file that was distributed with this source code.
*/ */
namespace Monolog\Writer; namespace Monolog\Writer;
class FileWriter extends StreamWriter class FileWriter extends StreamWriter
{ {
protected $rotation; protected $rotation;
protected $maxAge; protected $maxAge;
public function __construct($file, $rotation = null, $maxAge = null) public function __construct($file, $rotation = null, $maxAge = null)
{ {
parent::__construct($file); parent::__construct($file);
$this->rotation = $rotation; $this->rotation = $rotation;
$this->maxAge = $maxAge; $this->maxAge = $maxAge;
} }
public function close() public function close()
{ {
parent::close(); parent::close();
// TODO rotation // TODO rotation
} }
public function setRotation($rotation) public function setRotation($rotation)
{ {
$this->rotation = $rotation; $this->rotation = $rotation;
} }
public function setMaxAge($maxAge) public function setMaxAge($maxAge)
{ {
$this->maxAge = $maxAge; $this->maxAge = $maxAge;
} }
} }

View File

@@ -1,29 +1,29 @@
<?php <?php
/* /*
* This file is part of the Monolog package. * This file is part of the Monolog package.
* *
* (c) Jordi Boggiano <j.boggiano@seld.be> * (c) Jordi Boggiano <j.boggiano@seld.be>
* *
* For the full copyright and license information, please view the LICENSE * For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code. * file that was distributed with this source code.
*/ */
namespace Monolog\Writer; namespace Monolog\Writer;
use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\FormatterInterface;
class NullWriter implements WriterInterface class NullWriter implements WriterInterface
{ {
public function write($log, $level, $message) public function write($log, $level, $message)
{ {
} }
public function close() public function close()
{ {
} }
public function setFormatter(FormatterInterface $formatter) public function setFormatter(FormatterInterface $formatter)
{ {
} }
} }

View File

@@ -1,48 +1,59 @@
<?php <?php
/* /*
* This file is part of the Monolog package. * This file is part of the Monolog package.
* *
* (c) Jordi Boggiano <j.boggiano@seld.be> * (c) Jordi Boggiano <j.boggiano@seld.be>
* *
* For the full copyright and license information, please view the LICENSE * For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code. * file that was distributed with this source code.
*/ */
namespace Monolog\Writer; namespace Monolog\Writer;
use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\FormatterInterface;
class StreamWriter implements WriterInterface class StreamWriter implements WriterInterface
{ {
protected $formatter; protected $formatter;
protected $stream; protected $stream;
protected $url; protected $url;
public function __construct($streamUrl) public function __construct($streamUrl)
{ {
if (is_resource($streamUrl)) { if (is_resource($streamUrl)) {
$this->stream = $streamUrl; $this->stream = $streamUrl;
} else { } else {
$this->url = $streamUrl; $this->url = $streamUrl;
} }
} }
public function write($log, $level, $message) public function write($log, $level, $message)
{ {
if (null === $this->stream) { if (null === $this->stream) {
$this->stream = fopen($this->url, 'a'); $this->stream = fopen($this->url, 'a');
} }
fwrite($this->stream, $this->formatter->format($log, $level, $message)); if ($this->formatter) {
} $message = $this->formatter->format($log, $level, $message);
}
public function close() fwrite($this->stream, (string) $message);
{ }
fclose($this->stream);
} public function close()
{
public function setFormatter(FormatterInterface $formatter) fclose($this->stream);
{ $this->stream = null;
$this->formatter = $formatter; }
}
public function setFormatter(FormatterInterface $formatter)
{
$this->formatter = $formatter;
}
public function __destruct()
{
if (null !== $this->stream) {
$this->close();
}
}
} }

View File

@@ -0,0 +1,35 @@
<?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 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);
}
}

44
tests/Monolog/LogTest.php Normal file
View File

@@ -0,0 +1,44 @@
<?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;
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');
}
}

View File

@@ -0,0 +1,45 @@
<?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;
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'));
}
}

View File

@@ -0,0 +1,37 @@
<?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\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));
}
}