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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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];
|
||||||
|
}
|
||||||
}
|
}
|
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
35
tests/Monolog/Formatter/SimpleFormatterTest.php
Normal file
35
tests/Monolog/Formatter/SimpleFormatterTest.php
Normal 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
44
tests/Monolog/LogTest.php
Normal 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');
|
||||||
|
}
|
||||||
|
}
|
45
tests/Monolog/LoggerTest.php
Normal file
45
tests/Monolog/LoggerTest.php
Normal 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'));
|
||||||
|
}
|
||||||
|
}
|
37
tests/Monolog/Writer/StreamWriterTest.php
Normal file
37
tests/Monolog/Writer/StreamWriterTest.php
Normal 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));
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user